/*
 * 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.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( "pagina" );
                if( temp == null )
                {
                    pagina = 1;
                }
                else
                {
                    pagina = Integer.parseInt( temp );
                }
                pagina = ( pagina < 1 ) ? 1 : pagina;
                temp = request.getParameter( "cantidad" );
                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 );
            	
            	Double pri =  SupplierProduct.getPriceInCommunity( prodId.intValue(), 
            					Community.getComunityOfShopKeeper( establecimiento.getId(), 
                                SupplierProduct.getSupplierFromProduct( 
                                prodId.intValue() ) ) );
            	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 + "" ) );
            
            /// información de la paginacion
            inicio++;  // para no arrancar desde 0
            inicio = ( fin == 0 ) ? 0 : inicio;
            request.setAttribute( "inicio", inicio + "" );
            request.setAttribute( "fin", fin + "");
            request.setAttribute( "total", total + "" );
            request.setAttribute( "pagina", pagina + "" );
            request.setAttribute( "paginas", paginas + "" );
            request.setAttribute( "cantidad", resultadosPagina + "" );
            
            request.setAttribute( "message", message );


            url = "/minorista/catalogo.jsp";
        }
        
    }
    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";
    }
    
}
