public static Result detallesRecorridos() {

    RecorridoDAO recorridoDAO = new RecorridoDAO();
    // ojo ajustar
    List<Recorrido> lstRecorridos = recorridoDAO.listarRecorridos();

    Form<FormularioConsultaRecorrido> form =
        Form.form(FormularioConsultaRecorrido.class).bindFromRequest();

    if (form.hasErrors()) {
      flash("error", "Se encontraron errores al consultar el recorrido.");
      return badRequest(
          views.html.recorridosConsulta.render(
              Form.form(FormularioConsultaRecorrido.class), lstRecorridos, null, null));

    } else {
      FormularioConsultaRecorrido formularioConsultaRecorrido = form.get();

      Recorrido recorrido =
          recorridoDAO.consultarRecorridoPorId(formularioConsultaRecorrido.idRecorrido);
      FormularioRecorrido formRecorrido = new FormularioRecorrido();
      formRecorrido.tipoRecorrido = String.valueOf(recorrido.getTipo());
      formRecorrido.nombre = recorrido.getNombre();
      formRecorrido.descripcion = recorrido.getDescripcion();
      formRecorrido.horaFrecuente = recorrido.getHoraFrecuente();

      String diasFrecuentes = recorrido.getDiaFrecuente();
      formRecorrido.diaFrecuente = new ArrayList<String>();
      if (diasFrecuentes != null) {
        String[] arrDias = diasFrecuentes.split(",");
        for (int i = 0; i < arrDias.length; i++) {
          formRecorrido.diaFrecuente.add(arrDias[i]);
        }
      }

      formRecorrido.fechaInicioRuta =
          String.valueOf(recorrido.getLstRuta().get(0).getFechaInicioRuta());
      formRecorrido.fechaFinRuta = String.valueOf(recorrido.getLstRuta().get(0).getFechaFinRuta());
      formRecorrido.latitudInicio =
          String.valueOf(recorrido.getLstRuta().get(0).getLatitudInicio());
      formRecorrido.longitudInicio =
          String.valueOf(recorrido.getLstRuta().get(0).getLongitudInicio());
      formRecorrido.latitudFin = String.valueOf(recorrido.getLstRuta().get(0).getLatitudFin());
      formRecorrido.longitudFin = String.valueOf(recorrido.getLstRuta().get(0).getLongitudFin());
      formRecorrido.lugarInicio = recorrido.getLstRuta().get(0).getLugarInicio();
      formRecorrido.lugarFin = recorrido.getLstRuta().get(0).getLugarFin();
      formRecorrido.lstAmigos = new ArrayList<String>();

      Boolean existe = false;
      User usuario = Application.getLocalUser(session());
      for (UsuarioXRecorrido usuarioRecorrido : recorrido.getLstUsuarioXRecorrido()) {
        formRecorrido.lstAmigos.add(usuarioRecorrido.getUsuario().name);
        if (usuario.id == usuarioRecorrido.getUsuario().id) existe = true;
      }

      formRecorrido.idRecorrido = recorrido.getIdRecorrido();

      return ok(views.html.recorridosDetalle.render(formRecorrido, existe));
    }
  }
  /**
   * @param recorrido
   * @param ruta
   * @param listUsuarioRecorrido
   */
  private static void notificarInvitacionARecorrdo(
      Recorrido recorrido, Ruta ruta, List<UsuarioXRecorrido> listUsuarioRecorrido) {
    User usuarioSession = Application.getLocalUser(session());
    String usuarioInvita = usuarioSession.name;

    String nombreRecorrido = recorrido.getNombre();
    String lugarInicio = ruta.getLugarInicio();
    String lugarFin = ruta.getLugarFin();
    String descripcion = recorrido.getDescripcion();

    List<String> emailsInvitados = new ArrayList<String>();

    for (UsuarioXRecorrido usuarioRecorrido : listUsuarioRecorrido) {
      String emailPosible = usuarioRecorrido.getUsuario().email;
      if (emailPosible != null && !emailPosible.isEmpty()) {
        emailsInvitados.add(emailPosible);
      }
    }

    // Si alguno de los invitados tiene email
    if (emailsInvitados.size() > 0) {
      // Recorrido Frecuente
      if (recorrido.getTipo() == 0) {
        String horaFrecuente = recorrido.getHoraFrecuente();
        String diaFrecuente = recorrido.getDiaFrecuente();

        ICatalogoNotificaciones icn = CatalogoNotificaciones.getICatalogoInstance();
        icn.notificacionInvitacionRecorridoFrecuente(
            usuarioInvita,
            nombreRecorrido,
            lugarInicio,
            lugarFin,
            descripcion,
            horaFrecuente,
            diaFrecuente,
            emailsInvitados);

      }
      // Recorrido Recreacion
      else if (recorrido.getTipo() == 1) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd MMM, yyyy");

        String horaRecreacion = recorrido.getHoraFrecuente();
        String fechaInicio = sdf.format(ruta.getFechaInicioRuta());
        String fechaFin = sdf.format(ruta.getFechaFinRuta());

        ICatalogoNotificaciones icn = CatalogoNotificaciones.getICatalogoInstance();
        icn.notificacionInvitacionRecorridoRecreacion(
            usuarioInvita,
            nombreRecorrido,
            lugarInicio,
            lugarFin,
            descripcion,
            horaRecreacion,
            fechaInicio,
            fechaFin,
            emailsInvitados);
      }
    }
  }
  private static void cargarListas() {
    tipoRecorrido = new ArrayList<String>();
    tipoRecorrido.add("Frecuente");
    tipoRecorrido.add("Recreacion");

    diaFrecuente = new TreeMap<String, Boolean>();

    diaFrecuente.put("1-Lunes", false);
    diaFrecuente.put("2-Martes", false);
    diaFrecuente.put("3-Miercoles", false);
    diaFrecuente.put("4-Jueves", false);
    diaFrecuente.put("5-Viernes", false);
    diaFrecuente.put("6-Sabado", false);
    diaFrecuente.put("7-Domingo", false);

    horaSalida = new TreeMap<String, Boolean>();
    for (int i = 0; i < 24; i++) {
      horaSalida.put(String.format("%02d", i) + ":00", false);
      horaSalida.put(String.format("%02d", i) + ":30", false);
    }

    UserDAO userDao = new UserDAO();
    List<User> lstUser = userDao.listarUsuarios();

    User usuarioSession = Application.getLocalUser(session());
    lstAmigos = new TreeMap<String, Boolean>();
    for (User usuario : lstUser) {
      if (usuarioSession.id != usuario.id) lstAmigos.put(usuario.name + "-" + usuario.id, false);
    }
  }
  /**
   * @param recorrido
   * @param seUnio
   */
  private static void notificarCambioParticipacionRecorrido(Recorrido recorrido, boolean seUnio) {
    EstadoParticipacion estadoParticipacion =
        seUnio
            ? ICatalogoNotificaciones.EstadoParticipacion.UNIDO_A_RECORRIDO
            : ICatalogoNotificaciones.EstadoParticipacion.RETIRADO_DE_RECORRIDO;
    User usuarioSession = Application.getLocalUser(session());

    Ruta ruta = recorrido.getLstRuta().get(0);

    String emailUsuario = usuarioSession.email;
    String nombreUsuario = usuarioSession.name;

    String nombreRecorrido = recorrido.getNombre();
    String lugarInicio = ruta.getLugarInicio();
    String lugarFin = ruta.getLugarFin();
    String descripcion = recorrido.getDescripcion();

    if (emailUsuario != null && !emailUsuario.isEmpty()) {
      // Recorrido Frecuente
      if (recorrido.getTipo() == 0) {
        String horaFrecuente = recorrido.getHoraFrecuente();
        String diaFrecuente = recorrido.getDiaFrecuente();

        ICatalogoNotificaciones icn = CatalogoNotificaciones.getICatalogoInstance();
        icn.notificacionCambioParticipacionRecorridoFrecuente(
            estadoParticipacion,
            emailUsuario,
            nombreUsuario,
            nombreRecorrido,
            lugarInicio,
            lugarFin,
            descripcion,
            horaFrecuente,
            diaFrecuente);

      }
      // Recorrido Recreacion
      else if (recorrido.getTipo() == 1) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd MMM, yyyy");

        String horaRecreacion = recorrido.getHoraFrecuente();
        String fechaInicio = sdf.format(ruta.getFechaInicioRuta());
        String fechaFin = sdf.format(ruta.getFechaFinRuta());

        ICatalogoNotificaciones icn = CatalogoNotificaciones.getICatalogoInstance();
        icn.notificacionCambioParticipacionRecorridoRecreacion(
            estadoParticipacion,
            emailUsuario,
            nombreUsuario,
            nombreRecorrido,
            lugarInicio,
            lugarFin,
            descripcion,
            horaRecreacion,
            fechaInicio,
            fechaFin);
      }
    }
  }
  public static Result listarRetosUsuario() {

    RetoUsuarioDAO retoUsuarioDAO = new RetoUsuarioDAO();

    List<RetoUsuario> retos =
        retoUsuarioDAO.consultarRetosUsuario(Application.getLocalUser(session()));

    return ok(views.html.retosUsuario.render(retos));
  }
  public static Result inscribirARecorrido() {

    String mensaje = "";
    Form<FormularioConsultaRecorrido> form =
        Form.form(FormularioConsultaRecorrido.class).bindFromRequest();
    FormularioConsultaRecorrido formularioConsultaRecorrido = form.get();

    RecorridoDAO recorridoDao = new RecorridoDAO();
    Recorrido recorrido =
        recorridoDao.consultarRecorridoPorId(formularioConsultaRecorrido.idRecorrido);

    User usuarioSession = Application.getLocalUser(session());
    UsuariosXRecorridoDAO usuarioRecorridoDao = new UsuariosXRecorridoDAO();
    List<UsuarioXRecorrido> lstUsuarioRecorrido =
        usuarioRecorridoDao.consultarUsuarioEnRecorridoPorRecorridoYUsuario(
            recorrido, usuarioSession);

    if (lstUsuarioRecorrido.size() > 0) {
      usuarioRecorridoDao.eliminarUsuarioXRecorrido(lstUsuarioRecorrido.get(0));
      mensaje =
          "<div style='padding: 5px 5px 5px 5px; background-color:#c4ead0'>Se ha retirado del recorrido satisfactoriamente</div>";

      // Notificacion retiro
      notificarCambioParticipacionRecorrido(recorrido, false);

    } else {
      UsuarioXRecorrido usuarioRecorrido = new UsuarioXRecorrido();
      usuarioRecorrido.setRecorrido(recorrido);
      usuarioRecorrido.setUsuario(usuarioSession);
      usuarioRecorrido.setIndAdministrador(false);
      usuarioRecorrido.setIndConfirmado(true);
      usuarioRecorridoDao.agregarUsuarioXRecorrido(usuarioRecorrido);
      mensaje =
          "<div style='padding: 5px 5px 5px 5px; background-color:#c4ead0'>Se ha unido al recorrido satisfactoriamente</div>";

      // Notificacion union
      notificarCambioParticipacionRecorrido(recorrido, true);
    }

    return ok(mensaje);
  }
 @Restrict(Application.ADMIN_ROLE)
 public static Result getAllUsers() {
   // com.feth.play.module.pa.controllers.Authenticate.noCache(response());
   final User user = Application.getLocalUser(session());
   return ok(views.html.user.render(User.all()));
 }
  public static Result postFormRecorridos() {

    FormularioRecorrido formRecorrido1 = new FormularioRecorrido();

    Form<FormularioRecorrido> form = Form.form(FormularioRecorrido.class).bindFromRequest();
    if (form.hasErrors()) {
      flash("error", "Se encontraron errores al crear el recorrido.");
      return badRequest(
          views.html.recorridos.render(
              Form.form(FormularioRecorrido.class),
              tipoRecorrido,
              diaFrecuente,
              horaSalida,
              lstAmigos,
              null,
              null));

    } else {
      FormularioRecorrido formRecorrido = form.get();

      Recorrido recorrido = new Recorrido();
      recorrido.setTipo(0);
      if (formRecorrido.tipoRecorrido.contains("Recreacion")) recorrido.setTipo(1);

      recorrido.setNombre(formRecorrido.nombre);
      recorrido.setDescripcion(formRecorrido.descripcion);
      recorrido.setHoraFrecuente(formRecorrido.horaFrecuente);

      if (formRecorrido.diaFrecuente != null) {
        String cadDias = "";
        for (String dia : formRecorrido.diaFrecuente) {

          String solDia = dia.split("-")[1];

          cadDias += solDia + ",";
          System.out.println(solDia);
        }
        recorrido.setDiaFrecuente(cadDias);
      }

      Ruta ruta = new Ruta();
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

      if (formRecorrido.tipoRecorrido.contains("Recreacion")) {
        try {
          Date fechaInicio = format.parse(formRecorrido.fechaInicioRuta); // new Date();
          Date fechaFin = format.parse(formRecorrido.fechaFinRuta); // new Date();

          ruta.setFechaInicioRuta(fechaInicio);
          ruta.setFechaFinRuta(fechaFin);

        } catch (ParseException e) {
          e.printStackTrace();
        }
      }

      ruta.setLatitudInicio(Float.parseFloat(formRecorrido.latitudInicio));
      ruta.setLongitudInicio(Float.parseFloat(formRecorrido.longitudInicio));
      ruta.setLatitudFin(Float.parseFloat(formRecorrido.latitudFin));
      ruta.setLongitudFin(Float.parseFloat(formRecorrido.longitudFin));

      ruta.setLugarInicio(formRecorrido.lugarInicio);
      ruta.setLugarFin(formRecorrido.lugarFin);

      List<UsuarioXRecorrido> listUsuarioRecorrido = new ArrayList<UsuarioXRecorrido>();

      User usuario = Application.getLocalUser(session());
      UsuarioXRecorrido usuarioRecorrido = new UsuarioXRecorrido();
      usuarioRecorrido.setUsuario(usuario);
      usuarioRecorrido.setIndAdministrador(true);
      usuarioRecorrido.setIndConfirmado(true);

      listUsuarioRecorrido.add(usuarioRecorrido);
      UserDAO userDao = new UserDAO();

      for (String amigo : formRecorrido.lstAmigos) {
        usuario = userDao.consultarUsuarioPorId(Long.parseLong(amigo.split("-")[1]));
        usuarioRecorrido = new UsuarioXRecorrido();
        usuarioRecorrido.setUsuario(usuario);
        usuarioRecorrido.setIndAdministrador(false);
        usuarioRecorrido.setIndConfirmado(false);
        listUsuarioRecorrido.add(usuarioRecorrido);
      }

      insertarRecorrido(recorrido, ruta, listUsuarioRecorrido);
      // Notificacion Invitacion
      notificarInvitacionARecorrdo(recorrido, ruta, listUsuarioRecorrido);

      flash("success", "Se ha creado correctamente el recorrido.");
      return templateCrear(
          Form.form(FormularioRecorrido.class), tipoRecorrido, diaFrecuente, horaSalida, lstAmigos);
    }
  }