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

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.Community;
import com.fenalco.entities.DataAccess;
import com.fenalco.entities.ProductList;
import com.fenalco.entities.Store;
import com.fenalco.entities.SupplierList;
import com.fenalco.entities.SupplierProduct;
import com.fenalco.entities.User;
import com.fenalco.utilities.MessageBuilder;
import com.fenalco.utilities.lists.ProductListViewShopKeeper;
import com.fenalco.utilities.lists.SupplierListViewSysManager;

/**
 * Este servlet se encarga de realizar las búsquedas sobre el catálogo de
 * productos teniendo en cuenta los criterios especificados por el usuario en el
 * buscador, asi como los criterios de paginación
 * 
 * @author andres
 * @version
 */
public class CatalogueView extends HttpServlet
{

	/**
	 * Initializes the servlet.
	 */
	public void init( ServletConfig config ) throws ServletException
	{
		super.init( config );

	}

	/**
	 * Destroys the servlet.
	 */
	public void destroy( )
	{

	}

	/**
	 * Carga la lista de productos que cumplen las restricciones dadas en el
	 * buscador y los criterios de paginación y envia solo los datos que se
	 * deben mostrar en el jsp.
	 * 
	 * @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 = "/logout";
				message = MessageBuilder.buildMessage( 15 );
			}
			else
			{

				// obtengo el id del establecimiento
				Store establecimiento = ( Store )session.getAttribute( "store" );

				// carga la lista de proveedores para enviarla al jsp
				SupplierList proveedores = new SupplierList( establecimiento );
				SupplierListViewSysManager prov = new SupplierListViewSysManager( proveedores );

				// captura los criterios de búsqueda provenientes del jsp
				boolean esNombre = true;
				String nombre = "";
				int proveedor = 0;
				String categoria = "";
				int orden = 2;

				// criterios de paginación
				int pagina = 1;
				int resultadosPagina = 20;
				int paginas; // numero total de páginas
				int inicio = 0; // numero del primero registro que se va a
				// mostrar
				int fin = 19; // numero del último registro que se va a mostrar
				int total; // numero total de resultados

				try
				{
					String temp = request.getParameter( "esnombre" );
					if( temp == null )
					{
						temp = "1";
					}
					//                System.out.println( "TEMP = " + temp );
					if( Integer.parseInt( temp ) == 1 )
					{
						esNombre = true;
					}
					else
					{
						esNombre = false;
					}

					temp = request.getParameter( "nombre" );
					if( temp == null )
					{
						nombre = "";
					}
					else
					{
						nombre = temp;
					}
					temp = request.getParameter( "proveedor" );
					if( temp == null )
					{
						proveedor = 0;
					}
					else
					{
						proveedor = Integer.parseInt( temp );
					}
					temp = request.getParameter( "categoria" );
					if( temp == null )
					{
						categoria = "";
					}
					else
					{
						categoria = temp;
					}
					temp = request.getParameter( "ordenamiento" );
					if( temp == null )
					{
						orden = 2;
					}
					else
					{
						orden = Integer.parseInt( temp );
					}
					temp = request.getParameter( "page" );
					if( temp == null )
					{ 
                                            pagina = 1;
                                        }
					else
					{
						pagina = Integer.parseInt( temp );
					}
					pagina = ( pagina < 1 ) ? 1 : pagina;
					temp = request.getParameter( "pageResults" );
					if( temp == null )
                                        {
					        resultadosPagina = 20;
                                        }
					else
					{
						resultadosPagina = Integer.parseInt( temp );
					}
					resultadosPagina = ( resultadosPagina < 1 ) ? 20 : resultadosPagina;

				}
				catch( Exception e )
				{
					System.out.println( "Excepcion en el servlet del catalogo --> " + e );
				}

				User user = ( User )session.getAttribute( "user" );
				int emprId = user.getCompanyId( );

				ProductList lista = new ProductList( );
				Vector prices = new Vector( );

				// hago la búsqueda y obtengo solo los ids de los productos que
				// cumplen
				// los criterios seleccionados
				Vector ids1 = lista.loadIds( esNombre, nombre, proveedor, categoria, orden, proveedores, false );
				Vector ids = new Vector( );

				// voy a sacar del vector los productos que no tengan escala en
				// la comunidad
				for( int i = 0; i < ids1.size( ); i++ )
				{
					Integer prodId = ( Integer )ids1.elementAt( i );
					/*
					 * int estaId = establecimiento.getId(); System.out.println(
					 * "Establecimiento:"+estaId );
					 * 
					 * int supId = SupplierProduct.getSupplierFromProduct(
					 * prodId.intValue() ); System.out.println(
					 * "Supplier:"+supId );
					 * 
					 * int comuId = Community.getComunityOfShopKeeper( estaId,
					 * supId ); System.out.println( "Community:"+comuId );
					 */

					Double pri = SupplierProduct.getPriceInCommunity( prodId.intValue( ), Community
							.getComunityOfShopKeeper( establecimiento.getId( ), SupplierProduct
									.getSupplierFromProduct( prodId.intValue( ) ) ) );

					System.out.println( "Precio :" + pri.doubleValue( ) );
					if( pri.doubleValue( ) != 0 )
					{
						ids.addElement( prodId );
					}

				}

				// aqui se efectua la paginación
				total = ids.size( );
				paginas = ( int )Math.ceil( ( double )total / ( double )resultadosPagina );
				if( pagina > paginas )
				{
					pagina = paginas;
				}
				inicio = ( pagina - 1 ) * resultadosPagina;
				fin = pagina * resultadosPagina;
				inicio = ( inicio < 0 ) ? 0 : inicio;
				if( fin > total )
				{
					fin = total;
				}
				for( int i = inicio; i < fin; i++ )
				{
					//                System.out.println( "Buscando elemento " + i );
					Integer prodId = ( Integer )ids.elementAt( i );
					lista.addElement( prodId );

					// añado el precio del producto a la lista
					prices.addElement( SupplierProduct.getPriceInCommunity( prodId.intValue( ), Community
							.getComunityOfShopKeeper( establecimiento.getId( ), SupplierProduct
									.getSupplierFromProduct( prodId.intValue( ) ) ) ) );
				}

				ProductListViewShopKeeper vistaCatalogo;

				vistaCatalogo = new ProductListViewShopKeeper( lista );

				message = ( String )request.getAttribute( "message" );

				request.setAttribute( "proveedores", prov );
				request.setAttribute( "productos", vistaCatalogo );

				request.setAttribute( "prices", prices );

				// información de los criterios de búsqueda
				//            request.setAttribute( "esNombre", Boolean.valueOf( esNombre )
				// );
				request.setAttribute( "esNombre", Boolean.valueOf( esNombre + "" ) );
				request.setAttribute( "nombre", nombre );
				request.setAttribute( "proveedor", Integer.valueOf( proveedor + "" ) );
				request.setAttribute( "categoria", categoria );
				request.setAttribute( "ordenamiento", Integer.valueOf( orden + "" ) );
				request.setAttribute( "categorias", DataAccess.getCategories( ) );

				/// información de la paginacion
				inicio++; // para no arrancar desde 0
				inicio = ( fin == 0 ) ? 0 : inicio;
				request.setAttribute( "firstRow", inicio + "" );
				request.setAttribute( "lastRow", fin + "" );
				request.setAttribute( "total", total + "" );
				request.setAttribute( "page1", pagina + "" );
				request.setAttribute( "pages", paginas + "" );
				request.setAttribute( "pageResults", resultadosPagina + "" );

				request.setAttribute( "message", message );

				url = "/minorista/catalogo.jsp";
			}

		}
		catch( Exception e )
		{
			url = "/logout";
			message = MessageBuilder.buildMessage( 15 );
			e.printStackTrace( );
		}

		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";
	}

}