package com.fenalco.entities;

import java.util.Hashtable;
import java.util.Vector;

import com.fenalco.utilities.database.ExecuteSQLException;
import com.fenalco.utilities.database.QueryException;
import com.fenalco.utilities.database.SQLUtilities;
import com.fenalco.utilities.database.Transaction;

/**
 * Esta clase representa a un minorista
 */
public class ShopKeeper
{
	/**
	 * Identificador único del minorista
	 */
	private int shopKeeperId;

	/**
	 * Nombre del minorista (empresa)
	 */
	private String shopKeeperName;

	/**
	 * Este campo indica si el minorista tiene un nurit 0: no 1:si
	 */
	private int nurit;

	/**
	 * Constructor por defecto de la clase
	 */
	public ShopKeeper( )
	{
		// TODO: implement
	}

	/**
	 * Constructor que recibe el identificador de la empresa
	 * 
	 * @param shopKeeperId
	 *            Identificador de la empresa
	 */
	public ShopKeeper( int shopKeeperId)
	{
		this.shopKeeperId = shopKeeperId;
		this.loadData(shopKeeperId);
	}

	/**
	 * Consulta en la base de datos la tabla minorista por medio de la función
	 * <CODE>query</CODE> de la clase <CODE>SqlUtilities</CODE> para cargar
	 * los datos relacionados al minorista
	 * 
	 * @param shopKeeperId
	 *            Identificador del la empresa
	 * @return booleano que indica si la carga de los datos del minorista fué
	 *         exitosa
	 */
	public boolean loadData( int shopKeeperId )
	{
		boolean response = true;
		Vector result = new Vector();
		Hashtable shopKeeperData = new Hashtable();
		String sql = "SELECT empresa.empr_id, empr_nombre_comercial,mino_nurit "
				+ "FROM minorista, empresa "
				+ "WHERE minorista.empr_id ="
				+ shopKeeperId
				+ " AND "
				+ "minorista.empr_id = empresa.empr_id;";

		try
		{
			result = SQLUtilities.query(sql);

			shopKeeperData = (Hashtable) result.elementAt(0);
			this.shopKeeperId = ((Integer) shopKeeperData.get("empr_id"))
					.intValue();
			this.shopKeeperName = ((String) shopKeeperData
					.get("empr_nombre_comercial")).toString();
			this.nurit = ((Integer) shopKeeperData.get("mino_nurit"))
					.intValue();

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

	/**
	 * Cambia el estado de un proveedor para permitir o no que este se vea en el
	 * catálogo de productos que ve el minorista
	 * 
	 * @param supplierId
	 *            Identificador del proveedor
	 * @param newState
	 *            Nuevo estado (0,1)
	 * @return booleano que retorna si el cambio de estado fué exitoso
	 */
	public boolean changeSupplierState( String supplierId, int newState )
	{
		boolean response = true;
		String sql = "UPDATE minorista_proveedor SET mino_prov_catalogo=\'"
				+ newState + "\' " + "WHERE prov_empr_id =\'" + supplierId
				+ "\';";
		try
		{
			SQLUtilities.execute(sql);
		}
		catch (ExecuteSQLException qe)
		{
			response = false;
		}
		return response;
	}

	public boolean saveData( Transaction t )
	{
		boolean response = true;

		String sql = "INSERT INTO minorista VALUES(" + this.getShopKeeperId()
				+ "," + this.nurit + ");";
		t.addSql(sql);

		return response;
	}

	public boolean update( Transaction t )
	{
		boolean response = true;
		String sql = "UPDATE minorista SET mino_nurit=" + this.nurit
				+ " WHERE empr_id =" + this.shopKeeperId + ";";
		t.addSql(sql);

		return response;
	}

	public boolean delete( Transaction t )
	{
		boolean response = true;
		//Falta eliminar registros asociados con el minorista en otras tablas
		// i.e
		//Lista de compra, etc.
		String sql = "DELETE FROM minorista WHERE empr_id=" + this.shopKeeperId
				+ ";";
		t.addSql(sql);

		return response;
	}

	/**
	 * Consultor para el atributo shopKeeperId.
	 * 
	 * @return Valor del atributo shopKeeperId.
	 */
	public int getShopKeeperId( )
	{
		return shopKeeperId;
	}

	/**
	 * Modificador para el atributo shopKeeperId.
	 * 
	 * @param shopKeeperId
	 *            Nuevo valor para el atributo shopKeeperId.
	 */
	public void setShopKeeperId( int shopKeeperId )
	{
		this.shopKeeperId = shopKeeperId;
	}

	/**
	 * Consultor para el atributo shopKeeperName.
	 * 
	 * @return Valor del atributo shopKeeperName.
	 */
	public String getShopKeeperName( )
	{
		return shopKeeperName;
	}

	/**
	 * Modificador para el atributo shopKeeperName.
	 * 
	 * @param shopKeeperName
	 *            Nuevo valor para el atributo shopKeeperName.
	 */
	public void setShopKeeperName( String shopKeeperName )
	{
		this.shopKeeperName = shopKeeperName;
	}

	/**
	 * Consultor para el atributo nurit.
	 * 
	 * @return Valor del atributo nurit.
	 */
	public int getNurit( )
	{
		return nurit;
	}

	/**
	 * Consultor para el atributo nurit.
	 * 
	 * @param nurit
	 *            Nuevo valor para el atributo nurit.
	 */
	public void setNurit( int nurit )
	{
		this.nurit = nurit;
	}

	public static void main( String[] args )
	{
		ShopKeeper sk = new ShopKeeper();
		sk.setNurit(0);
		sk.setShopKeeperId(1);
		Transaction t = new Transaction();
		sk.delete(t);
		System.out.println("Result:" + t.execute());

	}
}