/*
 * SuperOfferPurchaser.java
 *
 * Created on 10 de agosto de 2004, 17:57
 */

package com.fenalco.servlets.shopkeeper;

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

/**
 * Este servlet es el encargado de generar la compra de una superoferta. Para
 * tal efecto recibe los parámetros <CODE>quantity</CODE>,<CODE>store
 * </CODE>,<CODE>id</CODE> de versuperoferta que son la cantidad,
 * establecimiento destino e id de la superoferta respectivamente.
 * 
 * @author Mario Linares Vásquez
 */
public class SuperOfferPurchaser extends HttpServlet
{

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

	}

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

	}

	/**
	 * Procesa solicitudes para los metodos HTTP <code>GET</code> y
	 * <code>POST</code>. Este método toma los parámetros storeId, quantity e
	 * id del request e invoca a la función miembro <CODE>buildOrder</CODE>
	 * para generar una orden de compra con la superoferta seleccionada. Como el
	 * resultado se muestra en una ventana popup al final del proceso se debe
	 * mostrar un mensaje resultado.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{

		String url = "";
		String message = "";
        HttpSession session = request.getSession( false );

	    try
	    {
	        if( session != null && ( User )session.getAttribute( "user" ) != null && ( ( User )session.getAttribute( "user" ) ).getRoleId() == 3 )
			{
				int superOfferId = Integer.parseInt(request.getParameter("id"));
				Store store = (Store) request.getSession().getAttribute("store");
				SuperOffer view = new SuperOffer(superOfferId);
	
				int storeId = store.getId();
	
				int communityId = DataAccess.getStoreCommunity(storeId, view
						.getSupplierId());
	
				int quantity = Integer.parseInt(request.getParameter("quantity"));
	
				if( this.buildOrder(superOfferId, storeId, communityId, quantity) == false )
				{
	
					//                    System.out.println("superoferta no enviada");
					message = MessageBuilder.buildMessage(26);//15 := "Orden de
															  // pedido no envíada"
				}
				else
				{
					message = MessageBuilder.buildMessage(25);//25 := "La compra de
															  // la super oferta ha
															  // sido realizada
															  // exitosamente"
					
					// guardo el registro de compra de la superoferta en el Log
	                try
	                {
	                    Transaction t = new Transaction( );
	                    Log l = new Log( );
						User user = ( User )session.getAttribute( "user" );
	                    String userId = user.getLogin();
	                    String numberId = user.getIdentificationNumber();
	                    String externalUser = "";
	                    User callcenter = ( User )session.getAttribute( "callcenter" );
	                    String description = "Compra de la superoferta " + view.getDescription();
	                    if( callcenter != null )
	                    {
	                        externalUser = callcenter.getLogin();
	                    }
						l.saveData(userId, numberId, 9, description, externalUser, t );
	                    t.execute();
	                }
	                catch( Exception ex )
	                {
	                    System.out.println( "Error guardando el Log." );
	                }
	
				}
	
				url = "/minorista/versuperoferta?id=" + superOfferId;
				request.setAttribute("operationType", "purchase");
				request.setAttribute("view", view);
	
			}
	
			else
			{
				message = MessageBuilder.buildMessage(15);
				url = "/index.jsp";
			}
	    }
	    catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
	    }

		request.setAttribute("message", message);

		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 <code>POST</code> method.
	 * 
	 * @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";
	}

	/**
	 * Esete método construye una orden de compra con la superoferta
	 * seleccionada y la cantidad de compra definida, para tal efecto debe crear
	 * una instancia de la clase <CODE>SuperOffer</CODE> con el parámetro
	 * superOfferId y luego invocar la función <CODE>submit</CODE> de la
	 * superoferta con los parámetros <CODE>storeId</CODE> y <CODE>quantity
	 * </CODE> tomados del <CODE>request</CODE>
	 * 
	 * @return boolean que representa el exito del proces
	 * @param superOfferId
	 *            id de la superoferta seleccionada
	 * @param storeId
	 *            id del establecimiento destino de la compra
	 * @param quantity
	 *            cantidad
	 */
	public boolean buildOrder( int superOfferId, int storeId, int communityId,
			int quantity )
	{

		boolean flag = false;
		//        System.out.println(superOfferId);
		SuperOffer superOffer = new SuperOffer(superOfferId);
		int id = superOffer.getProductId();
		PriceScale scale = new PriceScale(id, communityId);

		int minimun = ((Integer) ((Vector) scale.getValues().elementAt(0))
				.elementAt(1)).intValue();
		if( minimun < quantity )
		{
			superOffer.submit(storeId, communityId, quantity, 1, 1);
			flag = true;

		}

		return flag;

	}

}