package com.atrium.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.MessageFormat;
import java.util.ResourceBundle;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.atrium.hibernate.Usuarios;
import com.atrium.hibernate.modelo.IGestion_Usuario;
import com.atrium.spring.Acceso_ApplicationContext;

/**
 * Procesos de autenticacion en la aplicacion.
 * 
 * @author Roxana Ariza Sánchez.
 *  
 */
public class Login_Accion extends HttpServlet {

	// PARAMETROS DE CLASE PARA SU FUNCIONAMIENTO
	private Logger log = Logger.getLogger(Login_Accion.class);

	@Override
	public void init(ServletConfig config) throws ServletException {
		if (log.isDebugEnabled()) {
			log.trace("--->>>>>>>>> CREACION DEL SERVLET LOGIN <<<<<<<<<<<---");
		}
	}

	/**
	 * The doPost method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to
	 * post.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doPost(HttpServletRequest peticion,
			HttpServletResponse respuesta) throws ServletException, IOException {
		// AUXILIARES PARA LA REALIZACION DEL PROCESO
		boolean valido = true;
		String salida = "jsp/inicial.jsp?tarea=login.jsp";
		String error_clave = null;
		String error_nombre = null;
		// 1º CAPTURA DE INFORMACION DE LA PETICION ENVIADA
		String nombre = peticion.getParameter("nombre");
		String clave = peticion.getParameter("clave");
		// 2º CONVERSION
		// NO ES NECESARIA NINGUNA
		// 3º VALIDACION
		if (nombre.equals("")) {
			// ERROR DE NOMBRE VACIO
			valido = false;
			error_nombre = "El nombre es un campo obligatorio";
		} else if (nombre.length() > 20) {
			// ERROR EN LA VALIDACION DE TAMAÑO DE CAMPO (20 PARA NOMBRE)
			valido = false;
			error_nombre = MessageFormat.format("El tamaño máximo para el nombre son 20 caracteres"
					, nombre.length());
		}
		if (clave.equals("")) {
			// ERROR DE CLAVE VACIA
			valido = false;
			error_clave = "La clave es obligatoria";
		} else if (clave.length() > 10) {
			// ERROR EN LA VALIDACION DE TAMAÑO DE CAMPO (10 PARA CLAVE)
			error_clave = MessageFormat.format("El tamaño máximo para la clave son 10 caracteres"
					, clave.length());
		}
		// 4º LOGICA/NEGOCIO
		if (valido) {
			// CONSULTA A LA BASE DE DATOS DE LA INFORMACION NECESARIA
			Usuarios usuario = Acceso_ApplicationContext.getBean(
					IGestion_Usuario.class).consultar_PorNombre(nombre);
			if (usuario != null) {
				if (usuario.getContraseña().equals(clave)) {
					// USUARIO CORRECTO
					// INICIO DE SEGUIMIENTO DE SESION
					peticion.getSession().setAttribute("usuario", usuario);
					// ESTABLECEMOS LA NAVEGACION A LA PAGINA SIGUIENTE
					salida = "jsp/inicio.jsp?tarea=inicial.jsp";
				} else {
					// ERROR EN EL CLAVE DADA
					error_clave = "No existe ningún usuario con ese nombre";
				}
			} else {
				// ERROR EN EL NOMBRE DE USUARIO
				error_nombre = "La clave dada para este usuario no es correcta";
			}
		}
		// PASO DE MENSAJES DE ERROR, SI LOS HAY
		if (error_nombre != null) {
			peticion.setAttribute("error_nombre", error_nombre);
		}
		if (error_clave != null) {
			peticion.setAttribute("error_clave", error_clave);
		}
		// 5º NAVEGACION
		RequestDispatcher rqd = peticion.getRequestDispatcher(salida);
		rqd.forward(peticion, respuesta);
	}

	@Override
	public void destroy() {
		if (log.isDebugEnabled()) {
			log.trace("--->>>>>>>>> DESTRUCCION DEL SERVLET LOGIN <<<<<<<<<<<---");
		}
	}
}
