/*
 * QuoteHandler.java
 *
 * Created on 10 de agosto de 2004, 18:07
 */

package com.fenalco.servlets.supplier;

import java.io.IOException;
import java.util.Hashtable;

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

/**
 * Este servlet se encarga de realizar las operaciones de respuesta a una
 * cotización debe completar los precios de la cotización enviada por el
 * minorista y debe enviar un correo electrónico notificando el motivo de
 * aceptación o rechazo por parte del proveedor.
 * 
 * @author andres
 */
public class QuoteHandler extends HttpServlet
{

	/**
	 * Inicializa el servlet.
	 * 
	 * @param config
	 *            Parámetro de configuración
	 * @throws ServletException
	 *             Excepción de falla 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>.
	 * 
	 * Con el identificador de la cotización revisada, se crea un objeto del
	 * tipo <CODE>Quote</CODE> y un hashtable de objetos de tipo <CODE>
	 * QuoteProduct</CODE>.
	 * 
	 * Hace un llamado al método answer del objeto <CODE>Quote</CODE> para
	 * enviar la respuesta del proveedor al minorista.
	 * 
	 * @param request
	 *            Petición del 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 por medio del
	 *             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
			{
				url = "/proveedor/cotizacionesproveedor";
				Transaction t = new Transaction();
				Quote quote = new Quote(
						new Integer(request.getParameter("quoteId")).intValue());
	
				Hashtable products = new Hashtable();
				boolean priceZero = false;
	
				try
				{
					if( request.getParameterValues("item") != null )
					{
						String[] items = request.getParameterValues("item");
						for( int i = 0; i < items.length; i++ )
						{
							Integer key = new Integer(items[i]);
							System.out.println(key.intValue());
							double price = new Double(request
									.getParameter(items[i])).doubleValue();
							if( price > 0 )
							{
								QuoteProduct qp = new QuoteProduct(key.intValue());
								qp.setQuotePrice(price);
								products.put(key, qp);
							}
							else
							{
								priceZero = true;
								break;
							}
						}
	
						//Se almacenan los productos seleccionados en la cotización
						quote.setStatusId(2);
						quote.setProducts(products);
						System.out.println(products);
						quote.update(t);
					}
					else
					{
						//No se seleccionó ningún producto, se elimina la
						// cotización y se confirma via correo electrónico
						quote.delete(t);
					}
	
					//Falta verificar que se ha enviado el correo!!
					boolean mailSent = quote.answer(t, request
							.getParameter("subject"), request
							.getParameter("message"));
	
					if( !t.execute() || priceZero )
					{
						//Fallo al actualizar la cotizacion
						message = MessageBuilder.buildMessage(7);
					}
					else
					{
						//Todo OK
						//Actualizacion exitosa
						message = MessageBuilder.buildMessage(4);
						
						// 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 respondio la cotización " + quote.getId();
	                        User callcenter = ( User )session.getAttribute( "callcenter" );
	                        if( callcenter != null )
	                        {
	                            externalUser = callcenter.getLogin();
	                        }
	                        l.saveData(userId, numberId, 55, description, externalUser, t1 );
	                        t1.execute();
	                    }
	                    catch( Exception ex )
	                    {
	                        System.out.println( "Error guardando el Log." );
	                    }
	
					}
				}
				catch (NumberFormatException nfe)
				{
					message = MessageBuilder.buildMessage(7);
				}
			}
	    }
	    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 del 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 por medio del
	 *             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 del 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 por medio del
	 *             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";
	}

}