/*
 * CatalogueHandler.java
 *
 * Created on 10 de agosto de 2004, 17:59
 */

package com.fenalco.servlets.shopkeeper;

import java.io.IOException;
import java.util.Enumeration;
import java.util.StringTokenizer;
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.Community;
import com.fenalco.entities.PriceScale;
import com.fenalco.entities.ProductCategory;
import com.fenalco.entities.ShoppingCart;
import com.fenalco.entities.ShoppingCartProduct;
import com.fenalco.entities.Store;
import com.fenalco.entities.Supplier;
import com.fenalco.entities.SupplierProduct;
import com.fenalco.entities.User;
import com.fenalco.utilities.MessageBuilder;


/**
 * Este servlet se encarga de procesar los requerimientos del catálogo, es decir
 * las adiciones de productos al carrito
 *
 * @author  andres
 * @version
 *
 * Este servlet adiciona un producto del catalogo al carrito de compras
 * del usuario 
 */
public class CatalogueHandler extends HttpServlet {
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
     
    /** 
     * Recibe los id's de los productos que se quieren adicionar al carrito de compras y
     * la cantidad, con eso construye un objeto de tipo ProductShoppingCart y 
     * lo añade al carrito de compras que debe estar en la sesión, si el carrito
     * no está en la sesión, lo construye y lo mete a la sesión
     *
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException 
    {
        
        HttpSession session = request.getSession(false);
        String url = "";
        String message = "";
        
        try
	    {
	        
	        if( session == null || ( User )session.getAttribute( "user" ) == null || ( ( User )session.getAttribute( "user" ) ).getRoleId() != 3 )
	        {
	            url="/index.jsp";
	            message = MessageBuilder.buildMessage(15);
	        }
	        else
	        {
	
	            Enumeration e = request.getParameterNames();
	
	            // vector en donde se van a guardar los productos que se van a añadir al
	            // carrito de compras
	            Vector products = new Vector();
	
	            int errors = 0;
	
	            while( e.hasMoreElements() )
	            {
	                String p = ( String )e.nextElement();
	                int id; // id del producto a añadir
	                int quantity;   // cantidad del producto que se va a almacenar
	                if( p.startsWith( "producto" ) )
	                {
	                    StringTokenizer st = new StringTokenizer( p, "_" );
	                    st.nextToken();
	                    id = Integer.parseInt( st.nextToken() );
	                    String q = request.getParameter( p );
	                    try
	                    {
	                        quantity = Integer.parseInt( q );
	                    }
	                    catch( Exception exc )
	                    {
	                        quantity = 0;
	                    }
	
	                    if( quantity > 0 )
	                    { // si el usuario puso algun valor
	//                        out.println( id + " = " + quantity +"<br>" );
	
	                        // construyo el producto con los datos minimos
	                        SupplierProduct product = new SupplierProduct( );
	                        product.loadMinimalData(id);
	                        
	                        // busco la categria del producto 
	                        ProductCategory category = new ProductCategory( product.getCategory() );
	                        
	                        // busco el nombre del proveedor
	                        String supplierName = Supplier.getName( product.getSupplierId() );
	                        
	                        // busco el establecimiento
	                        Store store = ( Store )session.getAttribute( "store" );
	                        
	                        // busco el id de la comunidad
	                        int community = Community.getComunityOfShopKeeper( store.getId(), product.getSupplierId() );
	                        
	                        // busco la escala de precios que aplican paa ese producto
	                        // en esa comunidad
	                        PriceScale ps = new PriceScale( id, community );
	                        
	//                        if( ( ( Integer )( ( ( Vector )ps.getValues().elementAt( 0 ) ).elementAt( 1 ) ) ).intValue() <= quantity )
	//                        {
	                            // ya tengo toda la información necesaria
	                            // ahora construyo el ShoppingCartProduct
	                            ShoppingCartProduct shoppingCartProduct = new ShoppingCartProduct();
	                            shoppingCartProduct.setSupplierProductId( id );
	                            shoppingCartProduct.setCode( product.getCode() );
	                            shoppingCartProduct.setName( product.getShortDescription() );
	                            shoppingCartProduct.setCategory( category.getName() );
	                            shoppingCartProduct.setBrand( product.getBrand() );
	                            shoppingCartProduct.setSupplierId( product.getSupplierId() );
	                            shoppingCartProduct.setSupplierName(supplierName);
	                            shoppingCartProduct.setPrice( ps );
	                            shoppingCartProduct.setQuantity(quantity);
	                            shoppingCartProduct.setMinimum( ( ( Integer )( ( ( Vector )ps.getValues().elementAt( 0 ) ).elementAt( 1 ) ) ).intValue() );
	
	                            // ya tengo el producto, ahora toca meterlo al carrito
	
	                            ShoppingCart cart = ( ShoppingCart )session.getAttribute( "cart" );
	                            if( cart == null )
	                            {
	                                cart = new ShoppingCart();
	                            }
	
	                            if( !cart.addProduct( shoppingCartProduct ) )
	                            {
	                                errors++;
	                            }
	                            session.setAttribute( "cart", cart );
	//                        }
	//                        else
	//                        {
	//                            errors++;
	//                        }
	                    }
	                }
	            }
	            if( errors == 0 )
	            {
	                message = "Sus productos se añadieron correctamente al carrito de compras.";
	            }
	            else
	            {
	                message = "No todos los productos se añadieron correctamente al carrito de compras ya que "
	                        + "las cantidades seleccionadas son menores que las mínimas";
	            }
	        }
	        url = "/minorista/catalogo";
	    }
        catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
	    }
        request.setAttribute( "message", message );
        RequestDispatcher rd = getServletContext().getRequestDispatcher( url );
        rd.forward( request, response );
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}
