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

/**
 *
 * @author  Juan Ernesto Peña Kaltekis
 *
 * Esta clase representa una lista de minoristas
 * 
 * CONTROL DE CAMBIOS:
 *
 * Fecha        Autor       tipo        cambio      descripción
 *
 *
 */
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;
import com.fenalco.utilities.database.Transaction;

/**
 * Esta clase representa una lista de minoristas
 */
public class ShopKeeperList
{
	/**
	 * Es un Hashtable que tiene como llave un int que representa el id de una
	 * empresa minorista, el objeto es de tipo <CODE>ShopKeeper</CODE>
	 */
	private Hashtable shopKeepers;

	/**
	 * Constructor por omisión de la clase ShopKeeperList
	 */
	public ShopKeeperList( )
	{
		shopKeepers = new Hashtable();
		loadData();
	}

	/**
	 * Constructor de la clase para cargar la lista con los minoristas que un
	 * proveedor tiene activados
	 * 
	 * @param supplierId
	 *            Identificador del proveedor (empresa)
	 */
	public ShopKeeperList( int supplierId)
	{

		shopKeepers = new Hashtable();
		loadData(supplierId);
	}

	/**
	 * Hace una consulta en la tabla minorista por medio del método <CODE>query
	 * </CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la lista de
	 * minoristas y llenar la variable shopKeepers con todos los minoristas
	 * registrados en el sistema
	 * 
	 * @return Indica el éxito de la carga de los minoristas
	 */
	public boolean loadData( )
	{
		boolean respuesta = false;
		String sql = "SELECT empr_id FROM minorista;";
		try
		{
			Vector res = SQLUtilities.query(sql);
			int size = res.size();
			for( int i = 0; i < size; i++ )
			{
				Hashtable datos = (Hashtable) res.elementAt(i);
				int spid = ((Integer) datos.get("empr_id")).intValue();
				ShopKeeper sp = new ShopKeeper(spid);
				shopKeepers.put(new Integer(spid), sp);
			}
			respuesta = true;
		}
		catch (QueryException ex)
		{
			respuesta = false;
		}
		return respuesta;
	}

	/**
	 * Hace una consulta en la tabla minorista por medio del método <CODE>query
	 * </CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la lista de
	 * minoristas y llenar la variable shopKeepers con los minoristas activados
	 * por un proveedor
	 * 
	 * @param supplierId
	 *            Identificador del proveedor
	 * @return booleano que indica el éxito de la carga de los minoristas
	 */
	public boolean loadData( int supplierId )
	{
		boolean respuesta = false;
		/*
		 * String sql = "SELECT establecimiento.empr_id AS minorista FROM " +
		 * "establecimiento, proveedor_establecimiento " + "WHERE
		 * proveedor_establecimiento.empr_id=" + supplierId + " AND " +
		 * "proveedor_establecimiento.esta_id = establecimiento.esta_id;";
		 */

		String sql = "SELECT empr_id AS minorista FROM minorista_proveedor WHERE pro_empr_id="
				+ supplierId + ";";

		try
		{
			Vector res = SQLUtilities.query(sql);
			int size = res.size();
			for( int i = 0; i < size; i++ )
			{
				Hashtable datos = (Hashtable) res.elementAt(i);
				int spid = ((Integer) datos.get("minorista")).intValue();
				ShopKeeper sp = new ShopKeeper(spid);
				shopKeepers.put(new Integer(spid), sp);
			}
			respuesta = true;
		}
		catch (QueryException ex)
		{
			respuesta = false;
		}
		return respuesta;
	}

	public boolean nonClientList(int supplierId,int cityId){
        boolean response = true;
        this.shopKeepers.clear();
        
        Vector result = new Vector();
        Hashtable shopKeeperList = new Hashtable();
        String sql = "SELECT minorista.empr_id " +
                     "FROM minorista " +
                     "WHERE empr_id NOT IN " +
                     "(SELECT minorista_proveedor.empr_id " +
                     "FROM minorista_proveedor " +
                     "WHERE pro_empr_id="+supplierId+")";
        
        try{
            result = SQLUtilities.query(sql);
            for(int i=0;i<result.size();i++){
                shopKeeperList = (Hashtable)result.elementAt(i);
                this.shopKeepers.put((Integer)shopKeeperList.get("empr_id"),new ShopKeeper(((Integer)shopKeeperList.get("empr_id")).intValue()));
            }
           
        }catch(QueryException qe){
            response = false;
        }
        
        //Deja solamente a las empresas activas y los minoristas que no son exclusivos 
        
        Hashtable auxResult = new Hashtable();
        Hashtable auxResult2 = new Hashtable();
        Enumeration enumer = this.shopKeepers.keys();
        
        while(enumer.hasMoreElements()){
            Integer key = (Integer)enumer.nextElement();
            ShopKeeper shopKeeper = ((ShopKeeper)this.getShopKeepers().get(key));
            if(Company.getCompanyStatus(shopKeeper.getShopKeeperId())==2 && !DataAccess.isExclusive( shopKeeper.getShopKeeperId()) ){
                auxResult.put(key,shopKeeper);
            }
        }
        
        this.setShopKeepers(auxResult);
        return response;
   }

	/**
	 * Filtra La lista de minosristas 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.shopKeepers;

		Enumeration e = aux.elements();
		while( e.hasMoreElements() )
		{
			int shopKeeperId = ((ShopKeeper) e.nextElement()).getShopKeeperId();
			if( new Company(shopKeeperId).getCityId() != cityId )
			{
				this.shopKeepers.remove(new Integer(shopKeeperId));
			}
		}
	}

	/**
	 * Consultor para el atributo shopKeepers.
	 * 
	 * @return Valor para el atributo shopKeepers.
	 */
	public Hashtable getShopKeepers( )
	{
		return shopKeepers;
	}

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

	public static void main( String[] args )
	{
		ShopKeeperList skl = new ShopKeeperList();
		Transaction t = new Transaction();

		String sql = "UPDATE mensaje SET mens_expresion = 'Datos de ingreso no v&aacute;lidos' WHERE mens_id=2;";
		t.addSql(sql);

		String sql2 = "UPDATE mensaje SET mens_expresion = 'Eliminaci&oacute;n de datos exitosa' WHERE mens_id=5;";
		t.addSql(sql2);

		String sql3 = "UPDATE mensaje SET mens_expresion = 'La sesi&oacute;n ha expirado' WHERE mens_id=13;";
		t.addSql(sql3);

		String sql4 = "UPDATE mensaje SET mens_expresion = 'No ha iniciado sesi&oacute;n' WHERE mens_id=15;";
		t.addSql(sql4);

		String sql5 = "UPDATE mensaje SET mens_expresion = 'Registro de usuario completado con &eacute;xito' WHERE mens_id=17;";
		t.addSql(sql5);

		String sql6 = "UPDATE mensaje SET mens_expresion = 'Transacci&oacute;n no exitosa' WHERE mens_id=19;";
		t.addSql(sql6);

		String sql7 = "UPDATE mensaje SET mens_expresion = 'GLN no v&aacute;lido' WHERE mens_id=22;";
		t.addSql(sql7);

		String sql8 = "UPDATE mensaje SET mens_expresion = 'El minorista s&oacute;lo puede tener un establec.' WHERE mens_id=24;";
		t.addSql(sql8);

		System.out.println(t.execute());
		System.exit(0);

	}

}