/*
 * QuotePurchaser.java
 *
 * Created on 10 de agosto de 2004, 17:58
 */

package com.fenalco.servlets.shopkeeper;

import java.io.IOException;
import java.sql.Date;
import java.util.Enumeration;
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.DataAccess;
import com.fenalco.entities.Log;
import com.fenalco.entities.Order;
import com.fenalco.entities.OrderProduct;
import com.fenalco.entities.Quote;
import com.fenalco.entities.QuoteProduct;
import com.fenalco.entities.Store;
import com.fenalco.entities.User;
import com.fenalco.utilities.MessageBuilder;
import com.fenalco.utilities.database.Transaction;

/**
 * Este servlet es el encargado de construir la orden de compra sobre la
 * cotización seleccionada por el minorista.
 * 
 * @author Mario Linares Vásquez
 *  
 */
public class QuotePurchaser extends HttpServlet
{

	/**
	 * Inicializa el servlet.
	 * 
	 * @param config
	 * @throws ServletException
	 */
	public void init( ServletConfig config ) throws ServletException
	{
		super.init(config);

	}

	/**
	 * Destructor de servlet.
	 */
	public void destroy( )
	{

	}

	/**
	 * Procesa las solictudes de los métodos HTTP <code>GET</code> y
	 * <code>POST</code>. Este método invoca la función miembro <CODE>
	 * submitOrder</CODE> con los parámetros <CODE>id</CODE> del request y
	 * <CODE>store</CODE> de la sesiòn del <CODE>request</CODE> y
	 * redirecciona el flujo a el servlet miscotizaciones
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		String url = "/minorista/miscotizaciones";
		String message = "";
        HttpSession session = request.getSession( false );

	    try
	    {
	        if( session != null && ( User )session.getAttribute( "user" ) != null && ( ( User )session.getAttribute( "user" ) ).getRoleId() == 3 )
			{
				request.setAttribute("message", message);
	
				User user = (User) request.getSession().getAttribute("user");
				int quoteId = Integer.parseInt(request.getParameter("id"));
				Store store = (Store) request.getSession().getAttribute("store");
	
				if( store == null )
				{
					message = MessageBuilder.buildMessage(23);
				}
				else
				{
					int storeId = store.getId();
					int communityId = DataAccess.getStoreCommunity(storeId);
	
					if( this.submitOrder(quoteId, storeId, communityId, user) == false )
					{
						message = MessageBuilder.buildMessage(15);
					}
					else
					{
	                    try
	                    {
	                        Transaction t = new Transaction( );
	                        Log l = new Log( );
	                        String userId = user.getLogin();
	                        String numberId = user.getIdentificationNumber();
	                        String externalUser = "";
	                        User callcenter = ( User )session.getAttribute( "callcenter" );
	                        String description = "Compra de la cotización " + quoteId;
	                        if( callcenter != null )
	                        {
	                            externalUser = callcenter.getLogin();
	                        }
							l.saveData(userId, numberId, 10, description, externalUser, t );
	                        t.execute();
	                    }
	                    catch( Exception ex )
	                    {
	                        System.out.println( "Error guardando el Log." );
	                    }
	
					}
				}
	
			}
			else
			{
				message = MessageBuilder.buildMessage(15);
				url = "/index.jsp";
			}
	    }
	    catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
	    }
		RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
		dispatcher.forward(request, response);
	}

	/**
	 * Procesa el método HTTP <code>GET</code>.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void doGet( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Procesa el método HTTP <code>POST</code>.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void doPost( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Retorna una breve descripción de el servlet.
	 * 
	 * @return
	 */
	public String getServletInfo( )
	{
		return "Short description";
	}

	/**
	 * Este método construye la orden de compra a partir de la cotización
	 * seleccionada. Para tal efecto crea una instancia de la clase <CODE>Quote
	 * </CODE> con el parámetro <CODE>quoteId</CODE>; luego crea una
	 * instancia de <CODE>Order</CODE> con el constructor vacío , fija los
	 * atributos de esta con los métodos modificadores e invoca el método <CODE>
	 * saveData</CODE> con el respectivo <CODE>Transaction</CODE> y por
	 * último el método <CODE>submit</CODE>. Luego de creada la orden se debe
	 * eliminar la cotización con el método <CODE>delete</CODE>.
	 * 
	 * @param quoteId
	 *            id de la cotización
	 * @param storeId
	 *            id del establecimiento destino
	 * @param user
	 *            usuario que solicita la compra de la cotización
	 * @return boolean que representa el exito del proceso
	 */
	public boolean submitOrder( int quoteId, int storeId, int communityId,
			User user )
	{

		boolean flag = false;
		Transaction transaction = new Transaction();

		Quote quote = new Quote(quoteId);
		quote.calculateValue();

		Order order = new Order();
		order.setCompanyId(quote.getSupplierId());

		order.setCompanyName(user.getCompanyName());
		order.setDate(new Date((new java.util.Date()).getTime()));
		order.setDevice(0);
		order.setOrderOriginId(1);
		order.setOrderStatus(1);
		order.setOrderStatusName(DataAccess.getOrderStatusName(1));
		Hashtable products = quote.getProducts();
		Enumeration en = products.keys();
		while( en.hasMoreElements() )
		{
			QuoteProduct tempQuote = (QuoteProduct) products.get(en
					.nextElement());
			OrderProduct temp = new OrderProduct();

			temp.setOrderId(order.getId());
			temp.setOrderPrice(tempQuote.getQuotePrice());
			temp.setQuantity(tempQuote.getQuantity());
			temp.setSupplierId(tempQuote.getSupplierId());
			temp.setSupplierProductId(tempQuote.getSupplierProductId());

			order.addProduct(temp);

		}

		order.setStoreId(quote.getStoreId());
		order.setStoreName(quote.getStoreName());
		order.setValue(quote.getValue());
		order.saveData(transaction);

		quote.delete(transaction);

		if( transaction.execute() )
		{
			flag = order.submit();
		}

		return flag;

	}
}