/*
 * CompanyUsersHandler.java
 *
 * Created on 10 de agosto de 2004, 18:11
 */

package com.fenalco.servlets.supplier;

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.DataAccess;
import com.fenalco.entities.Supplier;
import com.fenalco.entities.User;
import com.fenalco.utilities.MessageBuilder;
import com.fenalco.utilities.database.Transaction;

/**
 * Este servlet toma las acciones necesarias de acuerdo a la operación
 * seleccionada por el usuario siendo las opciones: nuevo, actualizar y
 * eliminar.
 * 
 * @author andres
 */
public class CompanyUsersHandler extends HttpServlet
{

	/**
	 * Inicializa el servlet.
	 * 
	 * @param config
	 *            Parámetro de configuración
	 * @throws ServletException
	 *             Excepción de fallo en la operación de inicialización
	 */
	public void init( ServletConfig config ) throws ServletException
	{
		super.init(config);

	}

	/**
	 * Destruye el servlet.
	 */
	public void destroy( )
	{

	}

	/**
	 * Procesa las peticiones para los métodos HTTP <code>GET</code> y
	 * <code>POST</code>.
	 * 
	 * Identifica la petición del proveedor, de acuerdo al valor del paràmetro
	 * "operationType": - nuevo: "new" Crea un objeto <CODE>User</CODE> con
	 * los datos del formulario <CODE>nuevousuario.jsp</CODE> Luego llama al
	 * método <CODE>saveData</CODE>.
	 *  - actualizar: "update" Crea un objeto <CODE>User</CODE> con los datos
	 * del formulario <CODE>modificarusuario.jsp</CODE> Luego llama al método
	 * <CODE>update</CODE>.
	 *  - eliminar: "delete" Se crea el objeto <CODE>User</CODE> con el
	 * identificador del usuario y se llama al método <CODE>delete</CODE>.
	 * 
	 * @param request
	 *            Petición al servlet
	 * @param response
	 *            Respuesta del servlet
	 * @throws ServletException
	 *             Excepción de fallo en la operación de procesamiento de
	 *             peticiones
	 * @throws IOException
	 *             Excepción de fallo enla operación de escritura por medio de
	 *             <CODE>PrintWriter</CODE> de response.
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		HttpSession session = request.getSession(false);
		RequestDispatcher dispatcher;
		String url;
		String message = "";

	    try
	    {
	        if( session == null || ( User )session.getAttribute( "user" ) == null || ( ( User )session.getAttribute( "user" ) ).getRoleId() != 2 )
			{
				url = "/logout";
				//message = "Sesión no iniciada";
				message = MessageBuilder.buildMessage(15);
			}
			else
			{
	
				Transaction t = new Transaction();
				boolean readyToTransact = true;
				url = "/proveedor/usuariosempresa";
				String operationType = request.getParameter("operationType");
	
				if( operationType.equals("new") )
				{
					if( !addUser(request, t, session) )
					{
						//Fallo al agregar el usuario
						//message = "Fallo al agregar el usuario";
						message = MessageBuilder.buildMessage(18);
						readyToTransact = false;
					}
	
				}
				else
					if( operationType.equals("update") )
					{
						if( !updateUser(request, t) )
						{
							//Fallo al actualizar el usuario
							//message = "Fallo al actualizar el usuario";
							message = MessageBuilder.buildMessage(7);
							readyToTransact = false;
						}
	
					}
					else
						if( operationType.equals("delete") )
						{
							if( !deleteUser(request, t) )
							{
								//Fallo al eliminar el usuario
								//message = "Fallo al eliminar el usuario";
								message = MessageBuilder.buildMessage(8);
								readyToTransact = false;
							}
						}
	
				if( readyToTransact )
				{
					if( t.execute() )
					{
						//message = "La actualización de los usuarios de la empresa
						// finalizó correctamente";
						message = MessageBuilder.buildMessage(4);
					}
				}
			}
	    }
	    catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
	    }

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

	protected boolean addUser( HttpServletRequest request, Transaction t,
			HttpSession session )
	{
		User newUser = new User();
		boolean response = true;
		User supplier = (User) session.getAttribute("user");

		int userCount = Supplier.getUserCount(supplier.getCompanyId());
		//System.out.println(userCount);

		int userParameter = DataAccess
				.getSupplierUsers(supplier.getCompanyId());
		//System.out.println(userParameter);
		//Se compara si el proveedor puede agregar un nuevo usuario
		if( userCount < userParameter )
		{

			newUser.setLogin( request.getParameter("login") );
			newUser.setPassword(request.getParameter("passwd"));
			newUser.setRoleId(supplier.getRoleId());
			newUser.setRoleName(supplier.getRoleName());
			newUser.setCompanyId(supplier.getCompanyId());
			newUser.setCompanyName(supplier.getCompanyName());
			newUser.setFirstName(request.getParameter("firstName"));
			newUser.setLastName(request.getParameter("lastName"));
			newUser.setPositionId(new Integer(request.getParameter("position"))
					.intValue());
			newUser.setEmail(request.getParameter("email"));
			newUser.setIdentificationNumber(request.getParameter("idNumber"));
			newUser.setPhoneNumber(request.getParameter("phoneNumber"));
			response = newUser.saveData(t);
			//Habría que enviar usuario y passwd del nurit como NULL??

		}
		else
		{
			response = false;
		}

		return response;
	}

	protected boolean updateUser( HttpServletRequest request, Transaction t )
	{
		User updateUser = new User(request.getParameter("login"));

		if( request.getParameter("change") != null )
		{
			updateUser.setPassword(request.getParameter("passwd"));
		}

		updateUser.setFirstName(request.getParameter("name"));
		updateUser.setLastName(request.getParameter("lastName"));
		updateUser.setPositionId(new Integer(request.getParameter("position"))
				.intValue());
		updateUser.setEmail(request.getParameter("email"));
		updateUser.setIdentificationNumber(request.getParameter("idNumber"));
		updateUser.setPhoneNumber(request.getParameter("phoneNumber"));

		return updateUser.update(t);
	}

	protected boolean deleteUser( HttpServletRequest request, Transaction t )
	{

		String[] items = request.getParameterValues("item");
		boolean response = true;
		if( items != null )
		{
			for( int i = 0; i < items.length; i++ )
			{
				User deleteUser = new User();
				deleteUser.setLogin(items[i]);
				if( !deleteUser.delete(t) )
				{
					response = false;
					break;
				}
			}
		}
		else
		{
			response = false;
		}

		//deleteUser.setLogin((String)request.getParameter("userLogin"));
		//return deleteUser.delete(t);
		return response;
	}

	/**
	 * Maneja el método HTTP <code>GET</code>.
	 * 
	 * @param request
	 *            Petición al servlet
	 * @param response
	 *            Respuesta del servlet
	 * @throws ServletException
	 *             Excepción de fallo en la operación de procesamiento de
	 *             peticiones
	 * @throws IOException
	 *             Excepción de fallo enla operación de escritura por medio de
	 *             <CODE>PrintWriter</CODE> de response.
	 */
	protected void doGet( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Maneja el método HTTP <code>POST</code>.
	 * 
	 * @param request
	 *            Petición al servlet
	 * @param response
	 *            Respuesta del servlet
	 * @throws ServletException
	 *             Excepción de fallo en la operación de procesamiento de
	 *             peticiones
	 * @throws IOException
	 *             Excepción de fallo enla operación de escritura por medio de
	 *             <CODE>PrintWriter</CODE> de response.
	 */
	protected void doPost( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Información general del servlet.
	 * 
	 * @return Retorna una descripción general del servlet
	 */
	public String getServletInfo( )
	{
		return "Short description";
	}

}