/*
 * SuperOfferList.java
 * 
 * Created on 11 de agosto de 2004, 6:30
 */

/**
 *
 * @author  Juan Ernesto Peña Kaltekis
 *
 * Esta clase representa una lista de superofertas
 * 
 * CONTROL DE CAMBIOS:
 *
 * Fecha        Autor       tipo        cambio      descripción
 *
 *
 */
package com.fenalco.entities;

import java.sql.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.util.List;
import java.util.Collections;


import com.fenalco.utilities.database.QueryException;
import com.fenalco.utilities.database.SQLUtilities;

/**
 * Esta clase representa una lista de superofertas
 */
public class SuperOfferList
{

	/**
	 * Es un Hashtable que tiene como llave un int que representa el id de una
	 * superoferta, el objeto es de tipo <CODE>SuperOffer</CODE>
	 */
	private Vector superOffers;

	/**
	 * Constructor por defecto de la clase SuperOfferList
	 */
	public SuperOfferList( )
	{
		superOffers = new Vector();
		this.loadData();
	}

	/**
	 * Constructor de la clase SuperOffer
	 * 
	 * @param companyId
	 *            id que identifica a una empresa
	 * @param companyTypeId
	 *            id que indica el tipo de empresa
	 */
	public SuperOfferList( int companyId, int companyTypeId)
	{
		superOffers = new Vector();
		this.loadData(companyId, companyTypeId, 0);
	}

	/**
	 * Constructor de la clase SuperOffer
	 * 
	 * @param companyId
	 *            id que identifica a una empresa
	 * @param companyTypeId
	 *            id que indica el tipo de empresa
	 * @param storeeId
	 *            id que indica el establecimiento del minorista
	 */
	public SuperOfferList( int companyId, int companyTypeId, int storeId)
	{
		superOffers = new Vector();
		this.loadData(companyId, companyTypeId, storeId);
	}

	/**
	 * Hace una consulta en la tabla super_oferta por medio del método <CODE>
	 * query</CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la
	 * lista de superofertas y llenar la variable superOffers con todas las
	 * superofertas registradas en el sistema, ordenadas por fecha de inicio
	 * 
	 * @return booleano que indica si la carga de la lista fue exitosa
	 */
	public boolean loadData( )
	{
		boolean response = true;
		Vector result = new Vector();
		Hashtable aux = new Hashtable();
		String sql = "SELECT supe_ofer_id,supe_ofer_fecha_inicio "
				+ "FROM super_oferta ORDER BY supe_ofer_fecha_fin ASC;";
		try
		{
			result = SQLUtilities.query(sql);
			for( int i = 0; i < result.size(); i++ )
			{
				aux = (Hashtable) result.elementAt(i);
				this.superOffers.addElement(new SuperOffer(((Integer) aux.get("supe_ofer_id")).intValue()));
			}

		}
		catch (QueryException qe)
		{
			response = false;
		}
		return response;
	}

	/**
	 * Hace una consulta en la tabla super_oferta por medio del método <CODE>
	 * query</CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la
	 * lista de superofertas y llenar la variable superOffers con las
	 * superofertas ofrecidas por un proveedor o las ofertas que puede ver un
	 * cierto minorista (el tipo de empresa depende de los parámetros)
	 * 
	 * @param companyId
	 *            id que identifica a una empresa
	 * @param companyTypeId
	 *            id que identifica el tipo de una empresa 0:proveedor,
	 *            1:minorista
	 * @param storeId
	 *            id del establecimiento del minorista
	 * @return booleano que indica si la carga de la lista fué exitosa
	 */
	public boolean loadData( int companyId, int companyTypeId, int storeId )
	{
		boolean response = true;
		Vector result = new Vector();
		Hashtable aux = new Hashtable();
		String sql = "";
		switch (companyTypeId)
		{
			case 0:
				//Consulta de las superOfertas de un proveedor por el
				// administrador
				sql = "SELECT super_oferta.supe_ofer_id,supe_ofer_fecha_inicio "
						+ "FROM super_oferta,producto_proveedor "
						+ "WHERE producto_proveedor.prod_prov_id=super_oferta.prod_prov_id AND "
						+ "producto_proveedor.empr_id="
						+ companyId
						+ " "
						+ "ORDER BY supe_ofer_fecha_inicio ASC;";
				break;

			case 1:
				//Consulta de las superofertas visibles por un minorista
				/*
				 * sql = "SELECT DISTINTC supe_ofer_id " + "FROM
				 * super_oferta,proveedor_establecimiento,producto_proveedor,establecimiento,minorista " +
				 * "WHERE
				 * producto_proveedor.supe_ofer_id=super_oferta.supe_ofer_id AND " +
				 * "proveedor_establecimiento.empr_id =
				 * producto_proveedor.empr_id AND " +
				 * "establecimiento.empr_id,minorista.empr_id;";
				 */

				sql = "SELECT DISTINCT supe_ofer_id, supe_ofer_fecha_inicio"
						+ " FROM comunidad,comunidad_establecimiento, super_oferta"
						+ " WHERE esta_id="
						+ storeId
						+ " AND"
						+ " comunidad.comu_id=comunidad_establecimiento.comu_id AND"
						+ " comunidad.empr_id=super_oferta.empr_id" 
                                                + " ORDER BY supe_ofer_fecha_inicio ASC;";
				break;
			case 2:
				//Consulta de las superOfertas de un proveedor
				sql = "SELECT super_oferta.supe_ofer_id,supe_ofer_fecha_inicio "
						+ "FROM super_oferta "
						+ "WHERE super_oferta.empr_id="
						+ companyId
						+ " "
						+ "ORDER BY supe_ofer_fecha_inicio ASC;";
				break;
		}

		try
		{
			result = SQLUtilities.query(sql);
			for( int i = 0; i < result.size(); i++ )
			{
				aux = (Hashtable) result.elementAt(i);
				this.superOffers.addElement(new SuperOffer(((Integer) aux.get("supe_ofer_id")).intValue()));
			}

		}
		catch (QueryException qe)
		{
			response = false;
		}
		return response;
	}

	/**
	 * Consultor para el atributo superOffers.
	 * 
	 * @return Valor para el atributo superOffers.
	 */
	public Vector getSuperOffers( )
	{
		return superOffers;
	}

	/**
	 * Modificador para el atributo superOffers.
	 * 
	 * @param superOffers
	 *            Nuevo valor para el atributo superOffers.
	 */
	public void setSuperOffers( Vector superOffers )
	{
		this.superOffers = superOffers;
	}

	/**
	 * Deja en la lista de superofertas las superofertas que cumplan con el
	 * criterio
	 * 
	 * @param criteria
	 *            Criterio para filtrar ("active","inactive")donde el criterio
	 *            de inactiva identifica a una superoferta 1:activas 0:inactivas
	 *            cuya fecha de finalización ha expirado.
	 */
	public void filter( int criteria )
	{
		Vector result = new Vector();
		Date actualDate = new Date((new java.util.Date()).getTime());
		SuperOffer aux;
		Integer key;

		if( this.superOffers.size() > 0 )
		{
			Enumeration keys = this.superOffers.elements();
                        Vector temp = new Vector();

			switch (criteria)
			{
				case 0:
					//Deja en el Hashtable las superofertas inactivas
					while( keys.hasMoreElements() )
					{
						aux = (SuperOffer) keys.nextElement();
						if( ( !aux.getEndDate().after(actualDate) && !aux.getEndDate().toString().equals(actualDate.toString()) ) 
                                                    || aux.getStock() == 0 
                                                    || aux.getProductId() == 0
                                                    /*|| aux.getImageUrl().equals("")*/
                                                    )
                                                {
                                                    temp.add(aux);
                                                }
					}
					;
					break;

				case 1:
					//Deja en el Hashtable las superofertas activas
					while( keys.hasMoreElements() )
					{
						aux = (SuperOffer) keys.nextElement();
						if( ( !aux.getEndDate().before(actualDate) || aux.getEndDate().toString().equals(actualDate.toString()) )
                                                    && aux.getStock() > 0
                                                    && aux.getProductId() != 0
                                                    /*&& !aux.getImageUrl().equals("")*/
                                                    )
						{
                                                    temp.add(aux);
                                                }
					}
					;
					break;
			}
                        this.superOffers=temp;
		}

	}

	/**
	 *  
	 */
	public void filterValids( int storeId )
	{

		Vector result = new Vector();
		if( this.superOffers.size() > 0 )
		{
			Enumeration keys = this.superOffers.elements();
                        Vector temp2 = new Vector();
			while( keys.hasMoreElements() )
			{
				SuperOffer temp = (SuperOffer) keys.nextElement();
				int communityId = Community.getComunityOfShopKeeper(storeId,
						temp.getSupplierId());
				if( !DataAccess.isValidProduct(temp.getProductId(), communityId) )
				{
				}else{
                                    temp2.addElement(temp);
                                }
			}
                        this.superOffers=temp2;
		}
	}
        
        public void filterStock(){ 
            if( this.superOffers.size() > 0 )
		{
			Enumeration keys = this.superOffers.elements();
                        Vector temp2 = new Vector();
			while( keys.hasMoreElements() )
			{
				SuperOffer temp = (SuperOffer) keys.nextElement();
				if( temp.getStock() > 0 )
				{
                                           temp2.addElement(temp);
                                }
                                
				
                        }
                        
                        this.superOffers=temp2;
            }
        }
        
        public void shuffle(){
            List temp =this.getSuperOffers().subList(0, this.getSuperOffers().size());
            Collections.shuffle(temp);
            superOffers = new Vector();
            for(int i = 0 ; i < temp.size(); i++){
                superOffers.add((SuperOffer)temp.get(i));
            }
             
            
        }
        

	/**
	 * Esta función retorna la cantidad de superofertas de la lista
	 */
	public int getSize( )
	{
		return (this.getSuperOffers().size());
	}

        
        public void filter4ShopKeeper(String name, int supplierId){
                Vector aux = new Vector();

		Enumeration e = this.superOffers.elements();
		while( e.hasMoreElements() )
		{
                        boolean flag = false;
                        SuperOffer so = (SuperOffer) e.nextElement();
                        
                        String soName = so.getProductName().toLowerCase();
                        
                        if( !name.equals("") ){
                            
                            if( soName.indexOf(name.toLowerCase()) != -1 ){
                                flag = true;
                            }
                        
                        }
                        else{
                            flag = true;
                        }
                        
                        
                        if(supplierId != 0){
                            if(so.getSupplierId() == supplierId){
                               flag = flag && true;
                            }
                            else{
                                    flag = false;
                            }
                        }
                        
			if(flag){
                            aux.add(so);
                        }
		}
                
                this.superOffers =aux;
        }
        
	

}