/*
 * Created on 07-sep-2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.fenalco.entities;

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

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

/**
 * @author Andrés Romero Rodríguez
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class ProductCategory implements Cloneable
{

	/**
	 * indica si esta categoria es establecida por cabasnet
	 */
	private boolean cabasnet;

	/**
	 * identificador de la empresa que estableció la categoría, en caso de no se
	 * cabasnet
	 */
	private String company;

	/**
	 * codigo de la categoria, ya sea el de cabasnet o el de la empresa
	 */
	private int code;

	/**
	 * nombre de la categoria
	 */
	private String name;

	/**
	 * constructor por omisión, no hace nada
	 *  
	 */
	public ProductCategory( )
	{

	}

	/**
	 * constructor que recibe el identificador de la categoria y llama al método
	 * loadData para que la cargue de la base de datos
	 * 
	 * @param id
	 */
	public ProductCategory( int code)
	{
		this.code = code;
		loadData(code);
	}

	/**
	 * carga la información de la categoria desde la base de datos a partir del
	 * identificador
	 * 
	 * @param id
	 *            identificador de la categoria
	 * @return booleano que indica si se pudo efectuar la operación o no
	 */
	public boolean loadData( int code )
	{
		this.code = code;

		String sql = "SELECT cate_prod_cabasnet, cate_prod_empresa, cate_prod_nombre "
				+ "FROM categoria_producto WHERE cate_prod_codigo="
				+ code
				+ ";";
		try
		{
			Vector res = SQLUtilities.query(sql);
			Hashtable datos = (Hashtable) res.elementAt(0);

			cabasnet = ((Integer) datos.get("cate_prod_cabasnet")).intValue() == 1;
			company = (String) datos.get("cate_prod_empresa");
			name = (String) datos.get("cate_prod_nombre");

		}
		catch (Exception e)
		{
			System.out.println("Error cargando categoria de producto --> " + e);
			return false;
		}
		return true;
	}

	/**
	 * almacena la información de la categoría en la base de datos construyendo
	 * la instrucción sql y pasandola a la transacción para que la ejecute
	 * 
	 * @param transaction
	 *            la transacción que se está ejecutando
	 * @return booleano que indica si se pudo efectuar la operación o no
	 */
	public boolean saveData( Transaction transaction )
	{
		String sql = "INSERT INTO categoria_producto (cate_prod_cabasnet, cate_prod_empresa, "
				+ "cate_prod_codigo, cate_prod_nombre) VALUES("
				+ (cabasnet ? 1 : 0)
				+ ", "
				+ "\'"
				+ company
				+ "\', "
				+ code
				+ ", " + "\'" + name + "\'" + ");";
		transaction.addSql(sql);
		return true;
	}

	/**
	 * actualiza la información de la categoría en la base de datos construyendo
	 * la instrucción sql y pasandola a la transacción para que la ejecute
	 * 
	 * @param transaction
	 *            la transacción que se está ejecutando
	 * @return booleano que indica si se pudo efectuar la operación o no
	 */
	public boolean update( Transaction transaction )
	{
		if( code != 0 )
		{
			String sql = "UPDATE categoria_producto SET "
					+ "cate_prod_cabasnet=" + (cabasnet ? 1 : 0) + ", "
					+ "cate_prod_empresa=\'" + company + "\', "
					+ "cate_prod_codigo=" + code + ", " + "cate_prod_nombre=\'"
					+ name + "\' " + "WHERE cate_prod_codigo=" + code + ";";
			transaction.addSql(sql);

			return true;
		}
		return false;
	}

	/**
	 * elimina la información de la categoría en la base de datos construyendo
	 * la instrucción sql y pasandola a la transacción para que la ejecute
	 * 
	 * @param transaction
	 *            la transacción que se está ejecutando
	 * @return booleano que indica si se pudo efectuar la operación o no
	 */
	public boolean delete( Transaction transaction )
	{
		if( code != 0 )
		{
			// TODO: revisar si los productos están con llaves foraneas a esta
			// tabla para eliminarlos también
			// 
			String sql = "DELETE FROM categoria_producto WHERE cate_prod_codigo="
					+ code + ";";
			transaction.addSql(sql);
			return true;
		}
		return false;
	}

	/**
	 * @return Returns the cabasnet.
	 */
	public boolean isCabasnet( )
	{
		return cabasnet;
	}

	/**
	 * @param cabasnet
	 *            The cabasnet to set.
	 */
	public void setCabasnet( boolean cabasnet )
	{
		this.cabasnet = cabasnet;
	}

	/**
	 * @return Returns the code.
	 */
	public int getCode( )
	{
		return code;
	}

	/**
	 * @param code
	 *            The code to set.
	 */
	public void setCode( int code )
	{
		this.code = code;
	}

	/**
	 * @return Returns the company.
	 */
	public String getCompany( )
	{
		return company;
	}

	/**
	 * @param company
	 *            The company to set.
	 */
	public void setCompany( String company )
	{
		this.company = company;
	}

	/**
	 * @return Returns the name.
	 */
	public String getName( )
	{
		return name;
	}

	/**
	 * @param name
	 *            The name to set.
	 */
	public void setName( String name )
	{
		this.name = name.toUpperCase();
	}

	public int hashCode( )
	{
		return Math.abs(new java.util.Date().hashCode());
	}

	public static void main( String[] args )
	{
		ProductCategory cat = new ProductCategory();
		cat.setCabasnet(true);
		cat.setCode(3);
		cat.setName("categoria 3");
		Transaction t = new Transaction();
		cat.saveData(t);
		t.execute();

		System.exit(0);
	}

}