/**
   * Action usada para a denúncia de uma Dica considerada como imprópria pelo usuário.
   *
   * @param idDica O id da {@code Dica} denunciada.
   * @return O Result do POST, redirecionando para a página do {@code Tema} caso o POST tenha sido
   *     concluído com sucesso.
   */
  @Transactional
  @Security.Authenticated(Secured.class)
  public static Result denunciarDica(Long idDica) {
    Dica dica = dao.findByEntityId(Dica.class, idDica);

    String login = session("login");
    if (!dica.wasFlaggedByUser(login)) {
      dica.addUsuarioFlag(login);
      dica.incrementaFlag();

      if (dica.getFlag() == MAX_DENUNCIAS) {
        dao.removeById(Dica.class, idDica);

        for (MetaDica metadica : dica.getMetaDicas()) {
          metadica.getDicasAdicionadas().remove(dica);
          dao.merge(metadica);
        }
      } else {
        dao.merge(dica);
      }
    } else {
      flash("fail", "Usuário já denunciou a dica.");
    }

    dao.flush();

    return redirect(routes.Application.tema(dica.getTema().getId()));
  }
  @Transactional
  @Security.Authenticated(Secured.class)
  public static Result metadica(long id) {
    List<Disciplina> listaDisciplina = dao.findAllByClassName(Disciplina.class.getName());
    MetaDica metadica = dao.findByEntityId(MetaDica.class, id);
    Disciplina disciplina = metadica.getDisciplina();
    if (disciplina == null || metadica == null) {
      return erro();
    }

    return ok(views.html.metadica.render(listaDisciplina, disciplina, metadica));
  }
 @Transactional
 @Security.Authenticated(Secured.class)
 public static Result upVoteMetaDica(long idMetaDica) {
   MetaDica metaDica = dao.findByEntityId(MetaDica.class, idMetaDica);
   String login = session("login");
   if (!metaDica.wasVotedByUser(login)) {
     metaDica.addUsuarioQueVotou(login);
     metaDica.incrementaConcordancias();
     dao.merge(metaDica);
     dao.flush();
   }
   return redirect(routes.Application.disciplina(metaDica.getDisciplina().getId()));
 }
  @Transactional
  @Security.Authenticated(Secured.class)
  public static Result addDiscordanciaEmMetaDica(long idMetaDica) {
    DynamicForm filledForm = Form.form().bindFromRequest();

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

    if (filledForm.hasErrors()) {
      return disciplina(metaDica.getDisciplina().getId());
    } else {
      Map<String, String> formMap = filledForm.data();
      String username = session("username");
      String login = session("login");
      String discordancia = formMap.get("discordancia");

      metaDica.addUsuarioQueVotou(login);
      metaDica.addUserCommentary(username, discordancia);
      metaDica.incrementaDiscordancias();
      dao.merge(metaDica);
      dao.flush();

      return redirect(routes.Application.disciplina(metaDica.getDisciplina().getId()));
    }
  }
  /**
   * 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()));
    }
  }