/*
 * 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.Transaction;
import com.fenalco.utilities.database.SQLUtilities;

/**
 * @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);
        }
        
}