/*
 * SupplierClientsHandler.java
 *
 * Created on 10 de agosto de 2004, 18:13
 */

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

/**
 * Este servlet realiza un conjunto de operaciones importante para la
 * administración de los clientes del minorista. - Eliminar Minorista de la
 * lista de Clientes - Agregar un minorista a la lista de clientes.
 * 
 * @author andres
 */
public class SupplierClientsHandler 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 a los métodos HTTP <code>GET</code> y
	 * <code>POST</code>.
	 * 
	 * Para agregar o eliminar a un minorista de la lista de clientes se debe
	 * hacer un llamado al método <CODE>updateShopKeeperState(int value)
	 * </CODE> de un <B>objeto por definir </B> que establezca una relación
	 * entre el minorista y el proveedor.
	 * 
	 * La misma situación se tiene para el caso de los establecimientos.
	 * 
	 * @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 en la operación de escritura mediante el
	 *             flujo <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
			{
	
				String operationType = request.getParameter("operationType");
				User supplierUser = (User) session.getAttribute("user");
				url = "/proveedor/clientesproveedor";
                                
                                System.out.println( "OT:" + operationType + ":" );
                                
				if( operationType.equals("add") )
				{
					Transaction t = new Transaction();
					Supplier supplier;
					boolean ready = true;
	
					if( request.getParameterValues("item") != null )
					{
						String[] items = request.getParameterValues("item");
						for( int i = 0; i < items.length; i++ )
						{
							supplier = new Supplier();
							supplier.setSupplierId(supplierUser.getCompanyId());
							int in = new Integer(items[i]).intValue();
							if( !supplier.addClient( in, t) )
							{
								ready = false;
								break;
							}
							else
							{
                                                            // guardo el registro en el log
                                                            try
                                                            {
                                                                Transaction t1 = new Transaction( );
                                                                Log l = new Log( );
                                                                User user = ( User )session.getAttribute( "user" );
                                                                String userId = user.getLogin();
                                                                String numberId = user.getIdentificationNumber();
                                                                String externalUser = "";
                                                                String description = "El proveedor adiciono al cliente " + in;
                                                                User callcenter = ( User )session.getAttribute( "callcenter" );
                                                                if( callcenter != null )
                                                                {
                                                                    externalUser = callcenter.getLogin();
                                                                }
                                                                l.saveData(userId, numberId, 47, description, externalUser, t1 );
                                                                t1.execute();
                                                            }
                                                            catch( Exception ex )
                                                            {
                                                                System.out.println( "Error guardando el Log." );
                                                            }
	
							}
						}
					}
					else
					{
						ready = false;
					}
                                        
                                        
                                        url = "/proveedor/verminoristas";
                                        
					if( !t.execute() || !ready )
					{
	
						//Fallo al agregar minoristas a la lista de clientes
						message = MessageBuilder.buildMessage(19);
	
					}
					else
					{
	
						//Todo OK
						message = MessageBuilder.buildMessage(4);
	
					}
	
				}
				else
					if( operationType.equals("delete") )
					{
	
						Transaction t = new Transaction();
						String[] items = request.getParameterValues("item");
						Supplier supplier = new Supplier();
						supplier.setSupplierId(supplierUser.getCompanyId());
						boolean ready = true;
	
						if( items != null )
						{
							for( int i = 0; i < items.length; i++ )
							{
								int in = new Integer(items[i]).intValue();
								if( !supplier.removeClient( in, t) )
								{
									ready = false;
									break;
								}
								else
								{
									// registro la eliminación en el Log
                                                                    try
                                                                    {
                                                                        Transaction t1 = new Transaction( );
                                                                        Log l = new Log( );
                                                                        User user = ( User )session.getAttribute( "user" );
                                                                        String userId = user.getLogin();
                                                                        String numberId = user.getIdentificationNumber();
                                                                        String externalUser = "";
                                                                        String description = "El proveedor eliminó al cliente " + in;
                                                                        User callcenter = ( User )session.getAttribute( "callcenter" );
                                                                        if( callcenter != null )
                                                                        {
                                                                            externalUser = callcenter.getLogin();
                                                                        }
                                                                        l.saveData(userId, numberId, 48, description, externalUser, t1 );
                                                                        t1.execute();
                                                                    }
                                                                    catch( Exception ex )
                                                                    {
                                                                        System.out.println( "Error guardando el Log." );
                                                                    }
	
								}
	
							}
						}
	
						if( !t.execute() || !ready )
						{
	
							//Fallo al eliminar minoristas de la lista de clientes
							message = MessageBuilder.buildMessage(19);
	
						}
						else
						{
	
							//Todo OK
							message = MessageBuilder.buildMessage(28);
                                                        //message = "Retiro de clientes exitoso";
	
						}
	
					}else{
                                            
                                            //Paginador
                                            //System.out.println( "Paginador" );
                                            url = "/proveedor/verminoristas";
                                        }
			}
	    }
	    catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
	    }
                
                request.setAttribute("message", message);
		dispatcher = getServletContext().getRequestDispatcher(url);
		dispatcher.forward(request, 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 en la operación de escritura mediante el
	 *             flujo <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 en la operación de escritura mediante el
	 *             flujo <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";
	}

}