/*
 * ScaleHandler.java
 *
 * Created on 25 de agosto de 2004, 17:12
 */

package com.fenalco.servlets.supplier;

import java.io.IOException;
import java.util.Vector;

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

/**
 * Este servlet se encarga de procesar las operaciones que se realizan sobre las
 * escalas de precios de un producto en una comunidad determinada.
 * 
 * Estas operaciones se listan a continuación:
 *  - Agregar Escala - Modificar Escala - Eliminar Escala
 * @author Néstor Romero León
 */
public class ScaleHandler extends HttpServlet
{

	/**
	 * Inicializa el servlet.
	 * 
	 * @param config
	 *            Parámetro de configuración.
	 * @throws ServletException
	 *             Excepción de fallo en la operación del servlet.
	 */
	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>.
	 * 
	 * Este método relizará las siguientes operaciones:
	 *  - Agregar una nueva escala de precios.
	 * 
	 * Para esta operación se requieren los datos de la nueva escala de precios
	 * que consisten en un mínimo, un máximo y un precio.
	 * 
	 * Se crea un objeto <CODE>PriceScale</CODE> enviando como parámetros el
	 * identificador del producto del proveedor y el identificador de la
	 * comunidad, luego se hace un llamado al método <CODE>addScale</CODE> con
	 * los datos enviados por <CODE>escala.jsp</CODE>.
	 *  - Modificar una escala de precios.
	 * 
	 * Para modificar una escala de precios se construye un objeto de tipo
	 * <CODE>PriceScale</CODE> y se hace un llamado al método <CODE>update
	 * </CODE> del objeto, previamente hay que haber ingresado los vectores con
	 * las escalas que se desean almacenar en la base de datos.
	 *  - Eliminar una escala de precios.
	 * 
	 * Para eliminar una escala de precios se construye un objeto del tipo
	 * <CODE>PriceScale</CODE> luego se llama al método <CODE>delete</CODE>.
	 * Para eliminar la escala de precios ahi que cambiar la clase PriceScale
	 * gracias!!
	 * 
	 * @param request
	 *            Petición al servlet
	 * @param response
	 *            Respuesta del servlet
	 * @throws ServletException
	 *             Excepción de fallo en la operación del servlet.
	 * @throws IOException
	 *             Excepción de falo en la operación de escritura con el flujo
	 *             PrintWriter de response.
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		HttpSession session = request.getSession(false);
		RequestDispatcher dispatcher;

		String url = new String();
		String message = "";
		boolean readyToTransact = true;

	    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");
				PriceScale priceScale = null;
				Transaction t = new Transaction();
	
				int communityId = new Integer(request.getParameter("communityId")).intValue();
				int supplierProductId = new Integer(request.getParameter("supplierProductId")).intValue();
	
				url = "/proveedor/escala?key=" + supplierProductId
						+ "&communityId=" + communityId;
	
				if( operationType.equals("add") )
				{
	
					priceScale = new PriceScale(supplierProductId, communityId);
					int newMin = new Integer(request.getParameter("newMin"))
							.intValue();
					int newMax = new Integer(request.getParameter("newMax"))
							.intValue();
					double newPrice = new Double(request.getParameter("newPrice"))
							.doubleValue();
	
					int nextMin = priceScale.getNextMin();
					if( newMin == nextMin || nextMin == 1 )
					{
						priceScale.addToScale(newMin, newMax, newPrice);
	
						if( !priceScale.saveData(t) )
						{
							//Fallo al guardar la escala de precios
							//message = "Fallo al guardar la escala de precios";
							message = MessageBuilder.buildMessage(7);
							readyToTransact = false;
						}
						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 = "Se adiciono Una escala al producto " + supplierProductId 
													+ " en la comunidad " + communityId;
		                        User callcenter = ( User )session.getAttribute( "callcenter" );
		                        if( callcenter != null )
		                        {
		                            externalUser = callcenter.getLogin();
		                        }
		                        l.saveData(userId, numberId, 52, description, externalUser, t1 );
		                        t1.execute();
		                    }
		                    catch( Exception ex )
		                    {
		                        System.out.println( "Error guardando el Log." );
		                    }
	
						}
					}
					else
					{
						//!!!!!!!El mensaje deberia notificar que la escala no
						// cumple con el rango.
						message = MessageBuilder.buildMessage(7);
						readyToTransact = false;
					}
	
				}
				else
					if( operationType.equals("update") )
					{
	
						priceScale = new PriceScale(new Integer(request
								.getParameter("supplierProductId")).intValue(),
								new Integer(request.getParameter("communityId"))
										.intValue());
	
						Vector scales = priceScale.getValues();
						int scaleId = new Integer(request.getParameter("key"))
								.intValue();
	
						try
						{
	
							Double newPrice = new Double(request
									.getParameter(request.getParameter("key")));
							int i = 0;
							int position = 0;
							Vector scaleRow = new Vector();
							while( i < scales.size() )
							{
								scaleRow = (Vector) scales.elementAt(i);
								int vectorKey = ((Integer) scaleRow.elementAt(0))
										.intValue();
								if( vectorKey == scaleId )
								{
									position = i;
									scaleRow.setElementAt(newPrice, 3);
									break;
								}
								i++;
							}
	
							scales.add(i, scaleRow);
	
							priceScale.setValues(scales);
	
							if( !priceScale.update(t) )
							{
								//Fallo al actualizar la escala de precios
								//message = "Fallo al actualizar la escala de
								// precios";
								message = MessageBuilder.buildMessage(7);
								readyToTransact = false;
							}
							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 = "Se actualizó una escala al producto " + supplierProductId 
														+ " en la comunidad " + communityId;
			                        User callcenter = ( User )session.getAttribute( "callcenter" );
			                        if( callcenter != null )
			                        {
			                            externalUser = callcenter.getLogin();
			                        }
			                        l.saveData(userId, numberId, 53, description, externalUser, t1 );
			                        t1.execute();
			                    }
			                    catch( Exception ex )
			                    {
			                        System.out.println( "Error guardando el Log." );
			                    }
							}
						}
						catch (NumberFormatException nfe)
						{
							message = MessageBuilder.buildMessage(7);
							readyToTransact = false;
						}
	
					}
					else
						if( operationType.equals("delete") )
						{
							priceScale = new PriceScale(new Integer(request
									.getParameter("communityId")).intValue(),
									new Integer(request
											.getParameter("supplierProductId"))
											.intValue());
	
							if( !priceScale.deleteRow(new Integer(request
									.getParameter("key")).intValue(), t) )
							{
								//Fallo al eliminar la escala de precios
								//message = "Fallo al eliminar la escala de
								// precios";
								message = MessageBuilder.buildMessage(8);
								readyToTransact = false;
							}
							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 = "Se eliminó Una escala al producto " + supplierProductId 
														+ " en la comunidad " + communityId;
			                        User callcenter = ( User )session.getAttribute( "callcenter" );
			                        if( callcenter != null )
			                        {
			                            externalUser = callcenter.getLogin();
			                        }
			                        l.saveData(userId, numberId, 54, description, externalUser, t1 );
			                        t1.execute();
			                    }
			                    catch( Exception ex )
			                    {
			                        System.out.println( "Error guardando el Log." );
			                    }
	
							}
	
						}
	
				if( readyToTransact )
				{
					if( t.execute() )
					{
						User supplier = (User) request.getSession().getAttribute(
								"user");
	
						boolean existScale = PriceScale.existScale(new Integer(
								request.getParameter("supplierProductId"))
								.intValue(), supplier.getCompanyId());
	
						if( !existScale )
						{
							t = new Transaction();
							SupplierProduct.changeStatus(t, new Integer(request
									.getParameter("supplierProductId")).intValue(),
									0);
							t.execute();
						}
	
						//Todo Ok
						//message = "La actualización de la escala de precios
						// finalizó correctamente";
						message = MessageBuilder.buildMessage(4);
						request.setAttribute("priceScale", priceScale);
					}
				}
			}
	    }
	    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 del servlet.
	 * @throws IOException
	 *             Excepción de falo en la operación de escritura con el flujo
	 *             PrintWriter 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 del servlet.
	 * @throws IOException
	 *             Excepción de falo en la operación de escritura con el flujo
	 *             PrintWriter 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";
	}

}