import java.io.*;
import java.util.*;
import java.util.logging.*;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import javax.sql.*;
import javax.servlet.annotation.WebServlet;

@WebServlet(
	    name = "LoginServlet",
	    urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {
 
   private DataSource pool;   // Pool de conexiones a la base de datos
 
   @Override
   public void init(ServletConfig config) throws ServletException {
      try {
         // Crea un JNDI Initial context para poder luego buscar el DataSource
         InitialContext ctx = new InitialContext();
         // Busca el recurso DataSource en el contexto
         pool = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql_tiendalibros");
         if (pool == null)
            throw new ServletException("DataSource desconocida 'mysql_tiendalibros'");
      } catch (NamingException ex) {
         Logger.getLogger(LoginServlet.class.getName()).log(Level.SEVERE, null, ex);
      }
   }
   
 
 
   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();
 
      Connection conn = null;
      Statement  stmt = null;
      try {
         out.println("<html><head><title>Login</title></head><body>");
         out.println("<h2>Login</h2>");
 
         conn = pool.getConnection();  // Obtiene un conexión del pool
         stmt = conn.createStatement();
 
         // recupera los parámetros de la petición request usuario y password
         String usuario =(String) request.getParameter("usuario");
         String password = (String) request.getParameter("password");
         boolean noUsuario = usuario != null && ((usuario=usuario.trim()).length()>0);
         boolean noPwd = password != null && ((password=password.trim()).length()>0);
 
         // Valida los parámetros de la petición request
         if (!noUsuario) {
            out.println("<h3>Debes introducir tu usuario</h3>");
         } else if (!noPwd) {
            out.println("<h3>Debes introducir tu password</h3>");
         } else {
        	 
            // Verifica que existe algún usuario con ese login y password
            StringBuilder sqlStr = new StringBuilder();
            sqlStr.append("select * from usuarios where ");
            sqlStr.append("STRCMP(usuarios.usuario, '")
                  .append(usuario).append("') ");
            sqlStr.append("AND STRCMP(usuarios.password, '")
                  .append(password).append("')");
 
 // sqlStr.append("select * from usuarios where usuarios.usuario="+"'"+usuario+"and usuarios.password="+password+"'");
            ResultSet rset=stmt.executeQuery(sqlStr.toString());
;
            if (!rset.next()) {  // si no está vacio el resulset
               out.println("<h3>Nombre o contraseña incorrecta</h3>");
               out.println("<p><a href='index.html'>Vuelve a la página de login</a></p>");
            } else {
               
               // Crea una nueva HTTP Session y guarda el usuario como variable de sesión  
               // Primero, invalida la sesión si existe
               HttpSession session = request.getSession(false);
               if (session != null) {
                  session.invalidate();
               }
               session = request.getSession(true);
               synchronized (session) {
                  session.setAttribute("usuario", usuario);
                }
 
               out.println("<p>Hola, " + usuario + "!</p>");
               out.println("<p><a href='hazalgo'>Haz algo</a></p>");
            }
         }
         out.println("</body></html>");
 
      } catch (SQLException ex) {
         out.println("<h3>Servicio no disponible</h3></body></html>");
         Logger.getLogger(LoginServlet.class.getName()).log(Level.SEVERE, null, ex);
      } finally {
         out.close();
         try {
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();  // Devuelve la conexión al pool
         } catch (SQLException ex) {
            Logger.getLogger(LoginServlet.class.getName()).log(Level.SEVERE, null, ex);
         }
      }
   }
 
   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
      doGet(request, response);
   }
}