package servlet;

import java.sql.*;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class servlet_login
 */
public class sesion extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String correo = request.getParameter("correo");
        String contrasena = request.getParameter("contrasena");
        String mensaje = "Correo o CONTRASEÑA incorrectos.";
        // Validar entrada del usuario
        if (correo != null && contrasena != null && !correo.isEmpty() && !contrasena.isEmpty()) {
            try (Connection con = conexion_mysql.getConnection()) {
                // Consulta para verificar si el usuario existe y los intentos fallidos
                PreparedStatement listado_usuarios = con.prepareStatement("SELECT * FROM usuarios WHERE SUBSTRING_INDEX(correo, '@', 1) = ?");
                listado_usuarios.setString(1, correo);
                ResultSet obj_lis_usu = listado_usuarios.executeQuery();
                if (obj_lis_usu.next()) {
                    // Verificar intentos fallidos
                    int intentosFallidos = obj_lis_usu.getInt("intentos_fallidos");
                    if (intentosFallidos >= 3) {
                        mensaje = "Tu cuenta ha sido bloqueada por Multiples intentos fallidos.";
                    } else {
                        // Validar contraseÃ±a (en un entorno real, debes cifrar la contraseÃ±a)
                        String contrasenaGuardada = obj_lis_usu.getString("contrasena");
                        if (contrasenaGuardada.equals(contrasena)) {
                            // Iniciar sesiÃ³n correctamente y resetear intentos fallidos

                            try (PreparedStatement actualizar_resetear_intentos_sesion = con.prepareStatement("UPDATE usuarios SET intentos_fallidos = 0 WHERE SUBSTRING_INDEX(correo, '@', 1) = ?")) {
                                actualizar_resetear_intentos_sesion.setString(1, correo);
                                actualizar_resetear_intentos_sesion.executeUpdate();
                            }
                            // Crear sesion
                            HttpSession sesion = request.getSession();
                            sesion.setAttribute("usuario", correo);
                            sesion.setAttribute("rol", obj_lis_usu.getString("rol"));
                            
                            response.sendRedirect("inicio.jsp");  // Redirigir a la pÃ¡gina de bienvenida
                            return;
                        } else {
                            // Incrementar los intentos fallidos
                            try (PreparedStatement actualizar_aumentar_intentos_sesion = con.prepareStatement("UPDATE usuarios SET intentos_fallidos = intentos_fallidos + 1 WHERE SUBSTRING_INDEX(correo, '@', 1) = ?")) {
                                actualizar_aumentar_intentos_sesion.setString(1, correo);
                                actualizar_aumentar_intentos_sesion.executeUpdate();
                            }
                        }
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
                mensaje = "Error al conectar a la base de datos.";
            }
        } else {
            mensaje = "Por favor ingrese ambos campos.";
        }
        // Si el acceso es denegado, mostramos el mensaje de error
        request.setAttribute("mensaje", mensaje);
        request.getRequestDispatcher("sesion.jsp").forward(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}
