/*
 * 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.DataAccess;
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;
				String errorsMsg = "";

				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( q != null && q.length( ) > 0 )
							{
								errors++;
								errorsMsg += DataAccess.getProductName( id ) + " Formato incorrecto de numero\t";
							}
						}

						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 );

							Vector values = ps.getValues( );
							int max = 0;
							try
							{
								for( int i = 0; i < values.size( ); i++ )
								{
									int tm = ( ( Integer )( ( Vector )values.elementAt( i ) ).elementAt( 2 ) )
											.intValue( );
									if( tm > max )
									{
										max = tm;
									}
								}
							}
							catch( Exception exc )
							{
								System.out.println( exc );
							}

							//                        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( ) );
							shoppingCartProduct.setTax( product.getTax( ) );

							// ya tengo el producto, ahora toca meterlo al
							// carrito

							ShoppingCart cart = ( ShoppingCart )session.getAttribute( "cart" );
							if( cart == null )
							{
								cart = new ShoppingCart( );
							}

							if( ( shoppingCartProduct.getQuantity( ) + cart.getQuantity( shoppingCartProduct
									.getSupplierId( ), shoppingCartProduct.getSupplierProductId( ) ) ) <= max )
							{
								if( !cart.addProduct( shoppingCartProduct ) )
								{
									errors++;
									errorsMsg += shoppingCartProduct.getName( ) + " Menor al minimo ("
											+ shoppingCartProduct.getMinimum( ) + ")\t";
								}
							}
							else
							{
								errors++;
								errorsMsg += shoppingCartProduct.getName( ) + " Mayor al maximo (" + max + ")\t";
							}
							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 --> "
							+ errorsMsg;
				}
			}
                        
                        url = "/minorista/catalogo";
                        if(request.getParameter("proveedor2") != null){
                            url+= "?proveedor="+request.getParameter("proveedor2");
                        }
                        
                            
			
		}
		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";
	}

}