/*
 * ExternalUserValidator.java
 *
 * Created on 10 de agosto de 2004, 17:50
 */

package com.fenalco.servlets.callcenter;

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.User;
import com.fenalco.utilities.MessageBuilder;

/**
 *
 * @author  andres
 * @version
 *
 * Este servlet se encarga de validar el usuario por el cual se quiere iniciar sesión
 * 
 */
public class ExternalUserValidator extends HttpServlet
{
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /**
     *
     * Recibe el nombre de usuario y la cédula del usuario por el cual se quiere
     * iniciar sesión
     *
     * con el nombre de usuario crea un objeto de la clase usuario indicandole
     * que se cargue de la base de datos
     *
     * compara la cédula que viene en el objeto usuario con la que viene en el
     * request, y si son iguales hace lo siguiente:
     *
     * - saca de la sesión el atributo usuario dejando el atributo callcenter
     * - redirecciona /login enviandole el nombre de usuario y contraseña usando
     *   el método GET.
     *
     * Si no son iguales, redirecciona a /callcenter/callcenter enviandole un
     * mensaje que indique que los datos son incorrectos
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        String message = "";
        String url = "/callcenter/callcenter";
        HttpSession session = request.getSession(false);
        if(session == null){
            url="/index.jsp";
            message=MessageBuilder.buildMessage(15);
        }else{
        
            try{
                String login = request.getParameter("login");
                String identificationNumber = request.getParameter("identificationNumber");
                User user = new User();
                user = this.authenticateUser(login,identificationNumber);
                
                if(user!=null){
                    if( this.isActiveCompany(user) && user.getRoleId()!=1 ){
                        int roleId = user.getRoleId();
                        request.getSession().setAttribute("user",user);
                        url = DataAccess.getRoleUrl(roleId);
                    }else{
                        if(user.getRoleId()==1){
                            message = "Permiso denegado";
                        }else{
                            message = "Empresa no activa";
                        }
                    }
                }else{
                    message = "El usuario no existe";
                }
            }
            catch(NullPointerException npe){
                    message = "El usuario no existe";
            }
        }
        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);
    }
    
    /**
     *
     * @param request servlet request
     * @param response servlet 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 cedula 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 los números de cédula no sean iguales retorna null
     * @param username Nombre de usuario para construir el objeto <CODE>User</CODE>
     * @param identificationNumber la cédula  que se va a verificar con los datos del usuario
     * @return Objeto de tipo usuario si la cédula del usuario coincide con la que se recibió
     * como parámetro. null en caso contrario
     */    
    public User authenticateUser( String userName, String identificationNumber )
    {
        User user = null;
        try{
            user = new User(userName);
            String numberId = user.getIdentificationNumber();
            if(!numberId.equals(identificationNumber)){
                user=null;
            }
        }catch(Exception e){
            return null;
        }
        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;
    }    
    
}
