/* 
 * SupplierList.java
 *
 * Created on 11 de agosto de 2004, 11:36 --> fecha de creación del archivo
 */

package com.fenalco.entities;

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 un Listado de Proveedores, este listado será utilizado
 * principalmente por el minorista para filtar el catalogo de productos.
 * 
 * @author Néstor Romero León
 */
public class SupplierList
{

	/**
	 * Este Hashtable contiene a los proveedores que componen la lista, este
	 * Hashtable está constituido de la siguiente forma: key: supplierId value:
	 * Objeto Supplier
	 */
	private Hashtable suppliers;

	/**
	 * Constructor por omisión
	 * 
	 * Llama al método <CODE>loadData()</CODE> que carga una lista con todos
	 * los proveedores del sistema
	 */
	public SupplierList( )
	{
		this.suppliers = new Hashtable();
		this.loadData();
	}

	/**
	 * Este constructor recibe como parámetro el id del minorista <CODE>
	 * shopKeeperId</CODE> y carga una lista de los proveedores con los que
	 * tiene relación comercial.
	 * 
	 * Este constructor llama a la función <CODE>loadData(shopKeeperId)</CODE>
	 * y carga los datos de la base de datos en el objeto.
	 * 
	 * @param shopKeeperId
	 *            Identificador del minorista en la base de datos
	 */
	/*
	 * public SupplierList( int shopKeeperId ) { // TODO: implement
	 * this.suppliers=new Hashtable(); this.loadData(shopKeeperId); }
	 */

	public SupplierList( int storeId)
	{
		this.suppliers = new Hashtable();
		this.loadData(storeId);
	}

	public SupplierList( Store store)
	{
		this.suppliers = new Hashtable();
		this.loadData(store);
	}

	/**
	 * Este método carga una lista de todos los proveedores del sistema en el
	 * objeto a través del método <CODE>query</CODE> de la clase <CODE>
	 * SQLUtilities</CODE>
	 * 
	 * @return Valor booleano que identifica si la operación tuvo éxito o no
	 */
	public boolean loadData( )
	{
		// TODO: implement
		try
		{
			Vector results = new Vector();
			results = SQLUtilities
					.query("SELECT empr_id FROM empresa WHERE tipo_empr_id=2;");
			for( int i = 0; i < results.size(); i++ )
			{
				Hashtable temp = new Hashtable();
				temp = (Hashtable) results.elementAt(i);
				Integer key = (Integer) temp.get("empr_id");
				this.suppliers.put(key, new Supplier(key.intValue()));
			}
		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
			return false;
		}

		return true;
	}

	/**
	 * Este método carga desde la base de datos un listado de los proveedores
	 * que tienen una relación comercial con el minorista identificado por el
	 * parametro <CODE>shopKeeperId</CODE>.
	 * 
	 * @param shopKeeperId
	 *            Identificador del minorista en la base de datos
	 * @return Valor booleano que identifica si la operación tuvo éxito o no
	 */
	/*
	 * public boolean loadData(int shopKeeperId) { // TODO: implement try{
	 * Vector results = new Vector(); results = SQLUtilities.query("SELECT
	 * pro_empr_id FROM minorista_proveedor WHERE empr_id="+shopKeeperId+";");
	 * for(int i = 0 ; i < results.size() ; i++){ Hashtable temp = new
	 * Hashtable(); temp = (Hashtable)results.elementAt(i); Integer key =
	 * (Integer)temp.get("pro_empr_id"); this.suppliers.put(key, new
	 * Supplier(key.intValue())); } } catch(QueryException qe){
	 * System.out.println(qe.getMessage()); return false; }
	 * 
	 * return true; }
	 */

	public boolean loadData( int storeId )
	{
		try
		{
			Vector results = new Vector();
			String sql = "SELECT comunidad.empr_id FROM comunidad, comunidad_establecimiento "
					+ "WHERE comunidad.comu_id=comunidad_establecimiento.comu_id "
					+ "AND comunidad_establecimiento.esta_id=" + storeId + ";";

			System.out.println( sql );
			results = SQLUtilities.query(sql);
			for( int i = 0; i < results.size(); i++ )
			{
				Hashtable temp = new Hashtable();
				temp = (Hashtable) results.elementAt(i);
				Integer key = (Integer) temp.get("empr_id");
				this.suppliers.put(key, new Supplier(key.intValue()));
			}
		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
			return false;
		}

		return true;

	}

	/**
	 * Carga la lista de proveedores a partir del establecimiento indicado, pero
	 * revisa que el minorista dueño del establecimiento tenga activado al
	 * minorista para verlo en el catálogo.
	 */
	public boolean loadData( Store store )
	{
		int storeId = store.getId();
		// busco el id del minorista dueño del establecimiento
		int shopKeeperId = store.getCompanyId();

		try
		{
			Vector results = new Vector();
			String sql = "SELECT DISTINCT comunidad.empr_id FROM comunidad, comunidad_establecimiento, minorista_proveedor "
					+ "WHERE comunidad.comu_id=comunidad_establecimiento.comu_id "
					+ "AND comunidad_establecimiento.esta_id="
					+ storeId
					+ " AND minorista_proveedor.empr_id="
					+ shopKeeperId
					+ " AND minorista_proveedor.pro_empr_id=comunidad.empr_id "
					+ "AND minorista_proveedor.mino_prov_catalogo=1;";

			//           System.out.println( sql );
			results = SQLUtilities.query(sql);
			for( int i = 0; i < results.size(); i++ )
			{
				Hashtable temp = new Hashtable();
				temp = (Hashtable) results.elementAt(i);
				Integer key = (Integer) temp.get("empr_id");
				this.suppliers.put(key, new Supplier(key.intValue()));
			}
		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
			return false;
		}

		return true;

	}

	/**
	 * Filtra La lista de proveedores por ciudad
	 * 
	 * @param Id
	 *            de la ciudad por la cual se va a filtrar
	 */
	public void filterByCity( int cityId )
	{

		Hashtable aux = new Hashtable();
		aux = this.suppliers;

		Enumeration e = aux.elements();
		while( e.hasMoreElements() )
		{
			int supplierId = ((Supplier) e.nextElement()).getSupplierId();
			if( new Company(supplierId).getCityId() != cityId )
			{
				this.suppliers.remove(new Integer(supplierId));
			}
		}
	}

	/**
	 * Consultor para el atributo suppliers.
	 * 
	 * @return Valor del atributo suppliers.
	 */
	public Hashtable getSuppliers( )
	{
		return this.suppliers;
	}

	/**
	 * Modificador para el atributo suppliers.
	 * 
	 * @param suppliers
	 *            Nuevo valor del atributo suppliers.
	 */
	public void setSuppliers( Hashtable suppliers )
	{
		this.suppliers = suppliers;
	}

	public static void main( String args[] )
	{
		SupplierList lol = new SupplierList();
		Enumeration e = lol.getSuppliers().elements();

		while( e.hasMoreElements() )
		{
			Supplier lo = new Supplier();
			lo = (Supplier) e.nextElement();
			double s = lo.getMinimunOrder();
			int d = lo.getSupplierId();
			System.out.println("minimo: " + s);
			System.out.println("id: " + d);
		}

	}

}