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

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

      if (metaDica.getFlag() == MAX_DENUNCIAS) {
        dao.removeById(MetaDica.class, idMetaDica);
      } else {
        dao.merge(metaDica);
      }
    } else {
      flash("fail", "Usuário já denunciou a dica.");
    }

    dao.flush();

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