/*
 * Login.java
 *
 * Created on 10 de agosto de 2004, 18:53
 */

package com.fenalco.servlets;

import java.io.IOException;

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 javax.servlet.http.HttpSession;

import com.fenalco.entities.Company;
import com.fenalco.entities.DataAccess;
import com.fenalco.entities.Log;
import com.fenalco.entities.PasswordHandler;
import com.fenalco.entities.User;
import com.fenalco.utilities.database.Transaction;

/**
 * 
 * @author Mario Linares Vásquez
 * @version
 * 
 * Inicia la sesión validando el rol del usuario y redirecciona a la página
 * adecuada Además, pone en la sesión la información del usuario creando un
 * objeto de tipo user
 */
public class Login extends HttpServlet
{

	/**
	 * Inicializa el servlet.
	 */
	public void init( ServletConfig config ) throws ServletException
	{
		super.init(config);

	}

	/**
	 * Método destructor.
	 */
	public void destroy( )
	{

	}

	/**
	 * 
	 * Este servlet se encarga de recibir los datos del usuario e intenta
	 * iniciar la sesión, para ello se hace lo siguiente: - Se obtiene el nombre
	 * de usuario de los parámetros - Se obtiene la contraseña de los parámetros
	 * (esta viene encriptada en md5)
	 * 
	 * Los parametros que debe sacar del request son: - <B>login </B>: nomgbre
	 * de usuario - <B>passwd </B>: contraseña
	 * 
	 * Se crea un objeto de la clase <CODE>User</CODE> llamando al método
	 * authenticateUser, una vez se tiene ese objeto, se procede a verificar que
	 * la empresa a la que pertenece el usuario esté activa, esto se hace con el
	 * método isActiveCompany, si la empresa está activa entonces se sube el
	 * objeto usuario a la sesión, se verifica el rol que tiene el usuario y
	 * dependiendo de eso, redirecciona de la siguiente forma: - minorista -->
	 * /minorista/minorista - proveedor --> /proveedor/proveedor - administrador
	 * --> /administrador/administrador - call center --> /callcenter/callcenter
	 * 
	 * antes de redireccionar se mete en la sesión en un atributo llamado <CODE>
	 * user</CODE> el objeto usuario
	 * 
	 * Si las contraseñas no coinciden o si la empresa no está activa, se
	 * redirecciona a /index.jsp enviandole en el request una cadena que indique
	 * el error.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{

		String message = "";
		String url = "/index.jsp";
		try
		{
			String login = request.getParameter("login");
			String passwd = request.getParameter("passwd");
			User user = new User();
			user = this.authenticateUser(login, passwd);

                        System.out.println( user.getFirstName() + " " + user.getRoleId() + " " + user.getRoleName() );
                        
			if (user == null){
                            message = "DATOS INCORRECTOS";
                        }
                        else if( this.isActiveCompany(user) || user.getRoleId() == 1 || user.getRoleId() == 5)
			{
				int roleId = user.getRoleId();
				if( roleId == 4 )
				{
					request.getSession().setAttribute("callcenter", user);
				}
				else
				{
					request.getSession().setAttribute("user", user);
				}
				
                                url = DataAccess.getRoleUrl(roleId);
				
                                System.out.println( url );
                                
                                //role 3 = minorista
                                if(roleId == 3){
                                    //esta bendera se utiliza para mostrar popup de inicio del minorista
                                    request.setAttribute("msg","start");
                                }
                                
				// guardo el registro en el log
                                try
                                {
                                    HttpSession session = request.getSession();
                                    Transaction t1 = new Transaction( );
                                    Log l = new Log( );
                                    String userId = user.getLogin();
                                    String numberId = user.getIdentificationNumber();
                                    String externalUser = "";
                                    String description = "El usuario ha iniciado sesión";
                                    User callcenter = ( User )session.getAttribute( "callcenter" );
                                    if( callcenter != null )
                                    {
                                        externalUser = callcenter.getLogin();
                                    }
                                    l.saveData(userId, numberId, 1, description, externalUser, t1 );
                                    t1.execute();
                                }
                                catch( Exception ex )
                                {
                                    System.out.println( "Error guardando el Log." );
                                }

			}
			else
			{
				message = "EMPRESA NO ACTIVA";
			}
		}
		catch (NullPointerException npe)
		{
			message = "ERROR";
		}

		request.setAttribute("message", message);
		RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
		dispatcher.forward(request, response);

	}

	/**
	 * Handles the HTTP <code>GET</code> method.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 */
	protected void doGet( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

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

	/**
	 * Returns a short description of the servlet.
	 */
	public String getServletInfo( )
	{
		return "Short description";
	}

	/**
	 * este método se usa para validar un usuario, con el nombre de usuario crea
	 * un objeto de tipo <CODE>User</CODE>, una vez construido este objeto,
	 * compara la contraseña que se encuentra en el objeto con la que recibe
	 * como parámetro y si son iguales retorna el usuario recien construido
	 * 
	 * En caso de que las contraseñas no sean iguales retorna null
	 * 
	 * @param username
	 *            Nombre de usuario para construir el objeto <CODE>User</CODE>
	 * @param password
	 *            la contraseña que se va a verificar con los datos del usuario
	 * @return Objeto de tipo usuario si la contraseña del usuario coincide con
	 *         la que se recibio como parámetro. null en caso contrario
	 */
	public User authenticateUser( String userName, String password )
	{
		User user = null;

		if( PasswordHandler.verifyPassword(userName, password) )
		{
			String passwd = PasswordHandler.getPassword(userName);
			if( passwd.equals(password) )
			{
				user = new User(userName);
			}
		}

		return user;
	}

	/**
	 * Verifica si la empresa a la que está asociado el usuario está activa o no
	 * 
	 * @param u
	 *            usuario del cual se va a verificar la empresa
	 * @return un booleasno indicando si la empresa está activa o no
	 */
	public boolean isActiveCompany( User u )
	{
		boolean flag = false;
		int companyId = u.getCompanyId();
		int status = Company.getCompanyStatus(companyId);
		if( status == 2 )
		{
			flag = true;
		}

		return flag;
	}
}