/*
 * 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 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 Hashtable superOffers;

	/**
	 * Constructor por defecto de la clase SuperOfferList
	 */
	public SuperOfferList( )
	{
		superOffers = new Hashtable();
		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 Hashtable();
		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 Hashtable();
		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_inicio DESC;";
		try
		{
			result = SQLUtilities.query(sql);
			for( int i = 0; i < result.size(); i++ )
			{
				aux = (Hashtable) result.elementAt(i);
				this.superOffers.put((Integer) aux.get("supe_ofer_id"),
						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 DESC;";
				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"
						+ " 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;";
				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 DESC;";
				break;
		}

		try
		{
			result = SQLUtilities.query(sql);
			for( int i = 0; i < result.size(); i++ )
			{
				aux = (Hashtable) result.elementAt(i);
				this.superOffers.put((Integer) aux.get("supe_ofer_id"),
						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 Hashtable getSuperOffers( )
	{
		return superOffers;
	}

	/**
	 * Modificador para el atributo superOffers.
	 * 
	 * @param superOffers
	 *            Nuevo valor para el atributo superOffers.
	 */
	public void setSuperOffers( Hashtable 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.keys();

			switch (criteria)
			{
				case 0:
					//Deja en el Hashtable las superofertas inactivas
					while( keys.hasMoreElements() )
					{
						key = (Integer) keys.nextElement();
						aux = (SuperOffer) this.superOffers.get(key);
						if( (aux.getEndDate()).getTime() > actualDate.getTime() )
						{
							this.superOffers.remove(key);
						}
					}
					;
					break;

				case 1:
					//Deja en el Hashtable las superofertas activas
					while( keys.hasMoreElements() )
					{
						key = (Integer) keys.nextElement();
						aux = (SuperOffer) this.superOffers.get(key);
						if( (aux.getEndDate()).getTime() <= actualDate
								.getTime() )
						{
							this.superOffers.remove(key);
						}
					}
					;
					break;
			}
		}

	}

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

		Vector result = new Vector();
		if( this.superOffers.size() > 0 )
		{
			Enumeration keys = this.superOffers.keys();
			while( keys.hasMoreElements() )
			{
				Integer key = (Integer) keys.nextElement();
				SuperOffer temp = (SuperOffer) this.superOffers.get(key);
				int communityId = Community.getComunityOfShopKeeper(storeId,
						temp.getSupplierId());
				if( !DataAccess
						.isValidProduct(temp.getProductId(), communityId) )
				{
					this.superOffers.remove(key);
				}
			}

		}

	}

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

	public static void main( String[] args )
	{
		/*
		 * int companyId = 1; String 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 DESC;"; try{ System.out.println(sql);
		 * SQLUtilities.query(sql); }catch(QueryException qe){
		 * System.out.println("Query Error."+qe); System.exit(-1); }
		 * System.out.println("OK");
		 */
	}

}