@Transactional
  @Security.Authenticated(Secured.class)
  public static Result cadastrarDica(long idTema) {

    DynamicForm filledForm = Form.form().bindFromRequest();

    Map<String, String> formMap = filledForm.data();

    // long idTema = Long.parseLong(formMap.get("idTema"));

    Tema tema = dao.findByEntityId(Tema.class, idTema);
    String userName = session("username");

    if (filledForm.hasErrors()) {
      return tema(idTema);
    } else {
      String tipoKey = formMap.get("tipo");
      switch (tipoKey) {
        case "assunto":
          String assunto = formMap.get("assunto");
          DicaAssunto dicaAssunto = new DicaAssunto(assunto);

          tema.addDica(dicaAssunto);
          dicaAssunto.setTema(tema);
          dicaAssunto.setUser(userName);
          dao.persist(dicaAssunto);
          break;
        case "conselho":
          String conselho = formMap.get("conselho");
          DicaConselho dicaConselho = new DicaConselho(conselho);

          tema.addDica(dicaConselho);
          dicaConselho.setTema(tema);
          dicaConselho.setUser(userName);
          dao.persist(dicaConselho);
          break;
        case "disciplina":
          String disciplinas = formMap.get("disciplinas");
          String razao = formMap.get("razao");

          DicaDisciplina dicaDisciplina = new DicaDisciplina(disciplinas, razao);

          tema.addDica(dicaDisciplina);
          dicaDisciplina.setTema(tema);
          dicaDisciplina.setUser(userName);
          dao.persist(dicaDisciplina);
          break;
        case "material":
          String url = formMap.get("url");
          DicaMaterial dicaMaterial = new DicaMaterial(url);

          tema.addDica(dicaMaterial);
          dicaMaterial.setTema(tema);
          dicaMaterial.setUser(userName);
          dao.persist(dicaMaterial);
          break;
        default:
          break;
      }

      dao.merge(tema);

      dao.flush();

      return redirect(routes.Application.tema(idTema));
    }
  }
  /**
   * Action para o cadastro de uma metadica em uma disciplina.
   *
   * @param idDisciplina O id da {@code Disciplina}.
   * @return O Result do POST, redirecionando para a página da Disciplina caso o POST tenha sido
   *     concluído com sucesso.
   */
  @Transactional
  @Security.Authenticated(Secured.class)
  public static Result cadastrarMetaDica(long idDisciplina) {
    DynamicForm filledForm = Form.form().bindFromRequest();

    Map<String, String> formMap = filledForm.data();

    String comment = formMap.get("comentario");

    Disciplina disciplina = dao.findByEntityId(Disciplina.class, idDisciplina);
    String userName = session("username");

    if (filledForm.hasErrors()) {
      return disciplinaErro(disciplina);
    } else {
      MetaDica metaDica = new MetaDica(disciplina, userName, comment);

      Map<String, String[]> map = request().body().asFormUrlEncoded();

      String[] checkedDicas = map.get("dica");
      String[] checkedMetaDicas = map.get("metadica");

      if (checkedDicas == null && checkedMetaDicas == null) {
        return disciplinaErro(disciplina);
      }

      if (checkedDicas != null) {
        List<String> listaIdDicas = Arrays.asList(checkedDicas);

        for (String id : listaIdDicas) {
          Long idDica = Long.parseLong(id);

          Dica checkedDica = dao.findByEntityId(Dica.class, idDica);

          if (checkedDica != null) {
            metaDica.addDica(checkedDica);
            checkedDica.addMetaDica(metaDica);
            dao.merge(checkedDica);
          }
        }
      }
      if (checkedMetaDicas != null) {
        List<String> listaIdMetaDicas = Arrays.asList(checkedMetaDicas);

        for (String id : listaIdMetaDicas) {
          Long idMetaDica = Long.parseLong(id);

          MetaDica checkedMetaDica = dao.findByEntityId(MetaDica.class, idMetaDica);

          if (checkedMetaDica != null) {
            metaDica.addMetaDica(checkedMetaDica);
            dao.merge(checkedMetaDica);
          }
        }
      }

      disciplina.addMetaDica(metaDica);

      dao.persist(metaDica);
      dao.merge(disciplina);
      dao.flush();

      return redirect(routes.Application.disciplina(metaDica.getDisciplina().getId()));
    }
  }