/* 
 * ProductList.java
 *
 * Created on 12 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.SQLUtilities;

/**
 * Esta clase representa el catálogo de productos estándar que se utiliza dentro
 * del sistema.
 * 
 * @author Néstor Romero León
 */
public class ProductList
{
	/**
	 * Este <CODE>Hashtable</CODE> agrupa objetos del tipo <CODE>Product
	 * </CODE> que representan los productos del catálogo estándar de productos.
	 * Esta constituido así: key: Identificador del producto <CODE>productId
	 * </CODE> value: Objeto del tipo <CODE>ProductSupplier</CODE>
	 */
	private Vector products;

	/**
	 * Constructor por omisión
	 */
	public ProductList( )
	{
		products = new Vector();
	}

	/**
	 * Carga la lista de los id's con base en los criterios de búsqueda
	 * recibidos
	 */
	public Vector loadIds( boolean esNombre, String nombre, int proveedor,
			String categoria, int orden, SupplierList proveedores,
			boolean supplier )
	{
		Vector ids = new Vector();

		String sql;
		Vector categorias = new Vector();
		Vector res;
		Hashtable datos;
		String cond = "";

		nombre = nombre.toUpperCase();
		categoria = categoria.toUpperCase();

		// primero busco los codigos de las categorias que cumplan la condicion
		sql = "SELECT cate_prod_codigo FROM categoria_producto WHERE cate_prod_nombre "
				+ "LIKE \'%" + categoria + "%\';";
		//       System.out.println( sql );
		try
		{
			res = SQLUtilities.query(sql);
		}
		catch (Exception e)
		{
			System.out.println("Error cargando categorias --> " + e);
			res = new Vector();
		}

		for( int i = 0; i < res.size(); i++ )
		{
			datos = (Hashtable) res.elementAt(i);
			categorias.addElement(datos.get("cate_prod_codigo") + "");
		}

		// ahora construyo la condición para buscar por categorias
		for( int i = 0; i < categorias.size(); i++ )
		{
			if( i == 0 )
			{
				cond += "AND (";
			}

			cond += "cate_prod_codigo=" + categorias.elementAt(i) + " ";

			if( i < categorias.size() - 1 )
			{
				cond += "OR ";
			}

			if( i == categorias.size() - 1 )
			{
				cond += ") ";
			}
		}

		// para el ordenamiento de los resultados
		String orderby = "prod_prov_descripcion_corta, prod_prov_id";
		String select = "prod_prov_id";
		String from = "producto_proveedor";
                if( !supplier )
                {
                    from += ", minorista_proveedor";
                }
		switch (orden)
		{
			case 1: // codigo de barras
				orderby = "prod_prov_codigo, prod_prov_descripcion_corta, prod_prov_id";
				select = "prod_prov_codigo, prod_prov_descripcion_corta, "
						+ select;
				break;
			case 2: // nombre
				select = "prod_prov_descripcion_corta, " + select;
				break;
			case 3: // categoria
				orderby = "cate_prod_codigo, prod_prov_descripcion_corta, prod_prov_id";
				select = "cate_prod_codigo, prod_prov_descripcion_corta, "
						+ select;
				break;
			case 4: // proveedor
				from += ", empresa";
				//               orderby = "producto_proveedor.empr_id,
				// prod_prov_descripcion_corta, prod_prov_id";
				//               select = "producto_proveedor.empr_id,
				// prod_prov_descripcion_corta, " + select;
				orderby = "empresa.empr_nombre_comercial, prod_prov_descripcion_corta, prod_prov_id";
				select = "empresa.empr_nombre_comercial, prod_prov_descripcion_corta, "
						+ select;
				cond += " AND empresa.empr_id=producto_proveedor.empr_id ";
				break;
		}

		sql = "SELECT DISTINCT " + select + " FROM " + from + " WHERE ";
		/*
		 * si la busqueda no se hace por nombre, entonces se hace por el código
		 * de barras y por proveedor
		 */
		if( esNombre )
		{
			// buscando por nombre
			sql += "prod_prov_descripcion_corta LIKE \'%" + nombre + "%\' ";
			// buscando por categorias
			sql += cond;
		}
		else
		{
			sql += "prod_prov_codigo=\'" + nombre + "\' ";
		}
		// si el proveedor es 0, toca buscar por todos los proveedores
		String cond2 = "";
		if( proveedor != 0 )
		{
			cond2 = "AND producto_proveedor.empr_id=" + proveedor + " ";
		}
		else
		{
			Vector prov = new Vector();

			Hashtable p = proveedores.getSuppliers();
			Enumeration k = p.elements();

			//           System.out.println( "VOY A ENTRAR AL WHILE" );
			//           int iwhile = 0;
			while( k.hasMoreElements() )
			{
				//               iwhile++;
				//               System.out.println( "EN EL WHILE" );
				try
				{
					Supplier pr = (Supplier) k.nextElement();
					String sql112 = "SELECT prov_comparar FROM proveedor WHERE empr_id="
							+ pr.getSupplierId() + ";";
					Vector vec112 = SQLUtilities.query(sql112);
					Hashtable dat112 = (Hashtable) vec112.elementAt(0);
					Integer com112 = (Integer) dat112.get("prov_comparar");
					if( com112.intValue() == 1 )
					{
						//                       System.out.println( "EN EL IF DEL WHILE" );
						prov.addElement(pr);
					}
				}
				catch (Exception ex112)
				{
					System.out
							.println("Error mirando si el proveedor quiere ser comparado -->"
									+ ex112);
				}
			}

			// esto quiere decir que tengo que vuscar por todos los proveedores
			// pero no hay ninguno en la lista, por lo tanto no debe aparecer
			// ningun resultado
			if( prov.size() == 0 )
			{
				cond2 += "AND 1=-1 ";
			}

			// ahora construyo la condición para buscar por proveedores
			for( int i = 0; i < prov.size(); i++ )
			{
				if( i == 0 )
				{
					cond2 += "AND (";
				}

				Supplier sp = (Supplier) prov.elementAt(i);

				cond2 += "producto_proveedor.empr_id=" + sp.getSupplierId()
						+ " ";

				if( i < prov.size() - 1 )
				{
					cond2 += "OR ";
				}

				if( i == prov.size() - 1 )
				{
					cond2 += ") ";
				}
			}

		}

		sql += cond2;

		//       sql += "AND minorista_proveedor.empr_id=" + minorista + " ";
		//       sql += "AND
		// minorista_proveedor.pro_empr_id=producto_proveedor.empr_id ";
		//       sql += "AND minorista_proveedor.mino_prov_catalogo=1 ";
		if( !supplier )
		{
			sql += "AND prod_prov_estado=1 ";
		}
		sql += "ORDER BY " + orderby + " ASC;";

		System.out.println( sql );

		try
		{
			Vector r = SQLUtilities.query(sql);
			for( int i = 0; i < r.size(); i++ )
			{
				Hashtable d = (Hashtable) r.elementAt(i);
				ids.addElement(d.get("prod_prov_id"));
			}

		}
		catch (Exception e)
		{

		}

		return ids;
	}

	public void addElement( Object id )
	{
		SupplierProduct sp = new SupplierProduct();
		if( sp.loadMinimalData(((Integer) id).intValue()) )
		{
			products.addElement(sp);
		}
	}

	/**
	 * Consultor para el atributo products.
	 * 
	 * @return Valor del atributo products.
	 */
	public Vector getProducts( )
	{
		return products;
	}

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

}