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

/**
 *
 * @author  Juan Ernesto Peña Kaltekis
 *
 * Esta clase representa una lista de empresas
 * 
 * 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 empresas
 */
public class CompanyList
{
	/**
	 * Es un Hashtable que tiene como llave un INTEGER que representa el id de
	 * una empresa, el objeto es de tipo <CODE>Company</CODE>
	 */
	private Vector companies;

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


        /**
         * Constructor que permite cargar la lista de empresas o retornar la lista vacía
         * @param empty Indica si la lista de empresas se retorna vacia o no
         */
        public CompanyList(boolean empty){
            this.companies = new Vector();
            if(!empty){
                this.loadData();
            }
        }
        
	/**
	 * Constructor para filtrar el listado por el nombre de la empresa
	 */
	public CompanyList( String name)
	{
		this.companies = new Vector();
		this.loadData(name);
	}
        
        
	/**
	 * Hace una consulta en la tabla empresa por medio del método <CODE>query
	 * </CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la lista de
	 * empresas y llenar la variable companies con todas las empresas
	 * registradas en el sistema
	 * 
	 * @return Indica el éxito de la carga de las empresas
	 */
	public boolean loadData( )
	{
		boolean response = true;
		Vector result = new Vector();
		String sql = "SELECT empr_id FROM empresa ORDER BY empr_nombre_comercial ASC, empr_fecha_registro DESC;";
		Hashtable aux = new Hashtable();
		try
		{

			//Consulta Base de datos
			result = SQLUtilities.query(sql);

			//Carga de objetos
			for( int i = 0; i < result.size(); i++ )
			{
				aux = (Hashtable) result.elementAt(i);
                                if( ((Integer)aux.get("empr_id")).intValue() != 0){    //Código de la empresa para uso del sistema (PVL)
                                    this.companies.addElement(new Company(((Integer) aux.get("empr_id")).intValue()));
                                }    
			}

		}
		catch (QueryException qe)
		{
			//System.out.println("Query error :"+qe);
			response = false;
		}

		return response;
	}

        
	/**
	 * Hace una consulta en la tabla empresa por medio del método <CODE>query
	 * </CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la lista de
	 * empresas y llenar la variable companies con todas las empresas
	 * que cumplan con el filtro
	 * 
         * @param String name Cadena para filtrar por el nombre el listado de empresas
	 * @return Indica el éxito de la carga de las empresas
	 */
	public boolean loadData( String name){
		boolean response = true;
		Vector result = new Vector();   
		String sql = "SELECT empr_id " +
                                "FROM empresa " +
                                "WHERE empr_nombre_comercial LIKE \'%" + name + "%\' " +
                                "ORDER BY empr_nombre_comercial ASC, empr_fecha_registro DESC;";
		Hashtable aux = new Hashtable();
		try{

			//Consulta Base de datos
			result = SQLUtilities.query(sql);

			//Carga de objetos
			for( int i = 0; i < result.size(); i++ ){
				aux = (Hashtable) result.elementAt(i);
                                if( ((Integer)aux.get("empr_id")).intValue() != 0){    //Código de la empresa para uso del sistema (PVL)
                                    this.companies.addElement(new Company(((Integer) aux.get("empr_id")).intValue()));
                                }    
			}

		}catch (QueryException qe){
			//System.out.println("Query error :"+qe);
			response = false;
		}

		return response;
	}
        
        /**
         * Carga una lista de empresas que se registraron en el sistema de acuerdo al tipo de empresa, ciudad y un rango de fechas
         *
         * @param companyType Indica si la lista es de empresas minoristas(1) o proveedores(2)
         * @param cityId Id de la ciudad para filtrar
         * @param provinceId Id del departamento para filtrar
         * @param countryId Id del pais para filtrar
         * @param startDate Fecha inicial del rango de fechas
         * @param endDate Fecha final del rango de fechas
         */
        public boolean loadRegisteredCompanies(int companyType, int cityId, int provinceId, int countryId, Date startDate, Date endDate){

            boolean response = true;
            
            String select = "SELECT empr_id ";
            String from = "FROM empresa ";
            String where = "WHERE 1=1 ";
            String order = "ORDER BY empr_nombre_comercial ";
            String sql = "";
            
            where = where.concat("AND tipo_empr_id=" + companyType + " ");
            
            if(cityId != -1){
                where = where.concat("AND ciud_id=" + cityId + " ");
            }else if(provinceId != -1){
                from = from.concat(",ciudad ");
                where = where.concat("AND empresa.ciud_id=ciudad.ciud_id AND ciudad.depa_id=" + provinceId + " ");
            }else if(countryId != -1){
                from = from.concat(",ciudad, departamento ");
                where = where.concat("AND empresa.ciud_id=ciudad.ciud_id AND ciudad.depa_id=departamento.depa_id " +
                            "AND departamento.pais_id=" + countryId + " ");
            }
            
            if( startDate.getTime() > 0 && endDate.getTime() > 0){
                where = where.concat("AND (empr_fecha_activacion BETWEEN \'"+startDate+"\' AND \'"+endDate+"\') ");
            }else if( startDate.getTime() > 0 ){
                where = where.concat("AND (empr_fecha_activacion >= \'"+startDate+"\') ");
            }else if( endDate.getTime() > 0 ){
                where = where.concat("AND (empr_fecha_activacion <= \'"+endDate+"\') ");
            }
        
            sql = sql.concat(select + from + where + order + ";");
            System.out.println(sql);

            Vector result = new Vector();
            Hashtable aux = new Hashtable();
            try{
                //Consulta Base de datos
                result = SQLUtilities.query(sql);

                //Carga de objetos
                for( int i = 0; i < result.size(); i++ ){
                    aux = (Hashtable) result.elementAt(i);
                    if( ((Integer)aux.get("empr_id")).intValue() != 0){    //Código de la empresa para uso del sistema (PVL)
                        this.companies.addElement(new Company(((Integer) aux.get("empr_id")).intValue()));
                    }    
                }
            }catch (QueryException qe){
                //System.out.println("Query error :"+qe);
                response = false;
            }
            
            return response;
        }

        
        /**
         * Carga una lista de empresas que hallan realizado pedidos de acuerdo al tipo de empresa, ciudad y un rango de fechas
         *
         * @param companyType Indica si la lista es de empresas minoristas(1) o proveedores(2)
         * @param supplierId Id de un proveedor en caso de que se quiera retornar una lista de minoristas asociados con un proveedor especifico 
         * @param cityId Id de la ciudad para filtrar
         * @param startDate Fecha inicial del rango de fechas
         * @param endDate Fecha final del rango de fechas
         */
        public boolean loadTradingCompanies(int companyType, int supplierId, int cityId, int provinceId, int countryId, Date startDate, Date endDate){

            boolean response = true;
            
            String select = "SELECT DISTINCT(empresa.empr_id), empr_nombre_comercial ";
            String from = "FROM empresa, pedido ";
            String where = "WHERE 1=1 ";
            String order = "ORDER BY empr_nombre_comercial ";
            String sql = "";
            
            where = where.concat("AND tipo_empr_id=" + companyType + " ");
            
            if(cityId!=-1){
                from = from.concat(",establecimiento, barrio, zona, ciudad ");
                where = where.concat("AND pedido.esta_id=establecimiento.esta_id AND establecimiento.barr_id=barrio.barr_id " +
                        "AND barrio.zona_id=zona.zona_id AND zona.ciud_id=ciudad.ciud_id AND ciudad.ciud_id=" + cityId + " ");
            }
            
            if(cityId != -1){
                from = from.concat(",establecimiento, barrio, zona ");
                where = where.concat("AND pedido.esta_id=establecimiento.esta_id AND establecimiento.barr_id=barrio.barr_id " +
                        "AND barrio.zona_id=zona.zona_id AND zona.ciud_id=" + cityId + " ");
            }else if(provinceId != -1){
                from = from.concat(",establecimiento, barrio, zona, ciudad ");
                where = where.concat("AND pedido.esta_id=establecimiento.esta_id AND establecimiento.barr_id=barrio.barr_id " +
                        "AND barrio.zona_id=zona.zona_id AND zona.ciud_id=ciudad.ciud_id AND ciudad.depa_id=" + provinceId + " ");
            }else if(countryId != -1){
                from = from.concat(",establecimiento, barrio, zona, ciudad, departamento ");
                where = where.concat("AND pedido.esta_id=establecimiento.esta_id AND establecimiento.barr_id=barrio.barr_id " +
                        "AND barrio.zona_id=zona.zona_id AND zona.ciud_id=ciudad.ciud_id AND ciudad.depa_id=departamento.depa_id " +
                        "AND departamento.pais_id="+ countryId + " ");
            }
            
            
            if( startDate.getTime() > 0 && endDate.getTime() > 0){
                where = where.concat("AND (pedi_fecha BETWEEN \'"+startDate+"\' AND \'"+endDate+"\') ");
            }else if( startDate.getTime() > 0 ){
                where = where.concat("AND (pedi_fecha >= \'"+startDate+"\') ");
            }else if( endDate.getTime() > 0 ){
                where = where.concat("AND (pedi_fecha <= \'"+endDate+"\') ");
            }

            if(companyType==1){ //Minorista
                
                if(cityId==-1 && provinceId==-1 && countryId==-1){ //No se ha incluido establecimiento en el FROM
                    from = from.concat(",establecimiento ");    
                }
                
                where = where.concat("AND pedido.esta_id=establecimiento.esta_id AND establecimiento.empr_id=empresa.empr_id ");
                
                if(supplierId!=-1){
                    where = where.concat("AND pedido.empr_id= " + supplierId + " ");
                }
                
            }else{  //Proveedor
                where = where.concat("AND empresa.empr_id=pedido.empr_id ");
            }
            
            
            sql = sql.concat(select + from + where + order + ";");
            System.out.println(sql);

            Vector result = new Vector();
            Hashtable aux = new Hashtable();
            try{
                //Consulta Base de datos
                result = SQLUtilities.query(sql);

                //Carga de objetos
                for( int i = 0; i < result.size(); i++ ){
                    aux = (Hashtable) result.elementAt(i);
                    if( ((Integer)aux.get("empr_id")).intValue() != 0){    //Código de la empresa para uso del sistema (PVL)
                        this.companies.addElement(new Company(((Integer) aux.get("empr_id")).intValue()));
                    }    
                }
            }catch (QueryException qe){
                //System.out.println("Query error :"+qe);
                response = false;
            }
            
            return response;
        }
        
        
	/**
	 * Consultor para el atributo companies.
	 * 
	 * @return Valor para el atributo companies.
	 */
	public Vector getCompanies( )
	{
		return companies;
	}

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

	/**
	 * Deja en la lista de empresas las empresas que cumplan con el criterio
	 * 
	 * @param companyType Identifica el tipo de empresa que se desea buscar 
         * 1: minorista, 2: proveedor. (-1 para no filtrar)
	 */
	public void filter( int companyType )
	{
            if(companyType!=-1){
		Enumeration keys = this.companies.elements();
		Company c;
                Vector temp = new Vector();
		while( keys.hasMoreElements() )
		{
			c = (Company)keys.nextElement();
			if( c.getType() == companyType )
			{
				temp.addElement(c);
			}
		}
                this.companies=temp;
            }     
	}

	/**
	 * Deja en la lista de empresas las empresas que cumplan con el criterio
	 * 
	 * @param companyStatus
	 *            Identifica el estado que se desea buscar 1: nueva
	 */
	public void filterStatus( int companyStatus )
	{
		Enumeration keys = this.companies.elements();
		Company c;
                Vector temp = new Vector();
		while( keys.hasMoreElements() )
		{
			c = (Company) keys.nextElement();
			if( c.getStatus() == companyStatus )
			{
				temp.addElement(c);
			}
		}
                this.companies=temp;
	}

        
	/**
	 * Deja en la lista de empresas las empresas que cumplan con el criterio
	 * 
	 * @param cityId Identifica la ciudad por la que se desea filtrar (-1 si no se quiere filtrar)
	 */
	public void filterByCity( int cityId)
	{
            if(cityId != -1){
		Enumeration keys = this.companies.elements();
		Company c;
                Vector temp = new Vector();
		while( keys.hasMoreElements() ){
			c = (Company) keys.nextElement();
			if( c.getCityId() == cityId ){
				temp.addElement(c);
			}
		}
                this.companies=temp;
            }    
	}
        

	/**
	 * Deja en la lista de empresas las empresas que cumplan con el criterio
	 * 
         * @param provinceId Identifica el departamento por el que se desea filtrar (-1 si no se quiere filtrar)
	 */
	public void filterByProvince( int provinceId )
	{
            if(provinceId != -1){
		Enumeration keys = this.companies.elements();
		Company c;
                Vector temp = new Vector();
		while( keys.hasMoreElements() ){
			c = (Company) keys.nextElement();
                        City city = new City(c.getCityId());
			if( city.getProvince() == provinceId ){
				temp.addElement(c);
			}
		}
                this.companies=temp;
            }    
	}
        
        
	/**
	 * Deja en la lista de empresas las empresas que cumplan con el criterio
	 * 
         * @param countryId Identifica el pais por el que se desea filtrar (-1 si no se quiere filtrar)
	 */
	public void filterByCountry( int countryId )
	{
            if(countryId != -1){
		Enumeration keys = this.companies.elements();
		Company c;
                Vector temp = new Vector();
		while( keys.hasMoreElements() ){
			c = (Company) keys.nextElement();
                        City city = new City(c.getCityId());
                        Province province = new Province(city.getProvince());
			if( province.getCountry() == countryId ){
				temp.addElement(c);
			}
		}
                this.companies=temp;
            }    
	}

        
	/**
	 * Deja en la lista de empresas las empresas que cumplan con el criterio
	 * 
	 * @param cityId Identifica la ciudad por la que se desea filtrar (-1 si no se quiere filtrar)
         * @param provinceId Identifica el departamento por el que se desea filtrar (-1 si no se quiere filtrar)
         * @param countryId Identifica el pais por el que se desea filtrar (-1 si no se quiere filtrar)
	 */
	public void filterByRegions( int cityId, int provinceId, int countryId )
	{
            if(countryId != -1){
                this.filterByCountry(countryId);
                if(provinceId != -1){
                    this.filterByProvince(provinceId);
                    if(cityId != -1){
                        this.filterByCity(cityId);
                    }
                }
            }    
	}
        
        
        
        
	public static void main( String[] args )
	{
		CompanyList compa = new CompanyList();
		System.out.println(compa.getCompanies());
	}

}