/*
 * Order.java
 * Created on 15/08/2004
 */
package com.fenalco.entities;

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

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

/**
 * Esta clase encapsula el comportamiento de la tabla producto_pedido de la base
 * de datos.
 * 
 * @author Mario Linares Vásquez
 *  
 */
public class OrderProduct extends AbstractProduct
{

	/**
	 * Id del pedido
	 */
	private int orderId;

	private double orderPrice;

	/**
	 * Constructor por omisión de la clase
	 */
	public OrderProduct( )
	{
		tableId = this.hashCode();
	}

	/**
	 * Este constructor utiliza la función loadData para cargar los datos de la
	 * table producto_peddido en la base de datos
	 * 
	 * @param orderProductId
	 *            id del producto del pedido
	 */
	public OrderProduct( int orderProductId)
	{

		this.tableId = orderProductId;
		this.loadData(orderProductId);
	}

	/**
	 * Carga los datos de la tabla producto_pedido de acuerdo con el id
	 * proporcionado
	 * 
	 * @param orderProductId
	 *            id del producto del pedido
	 * @return boolean que representa el exito del proceso
	 */
	public boolean loadData( int orderProductId )
	{
		boolean flag = false;
		try
		{
			Vector results = new Vector();
			results = SQLUtilities
					.query("SELECT prod_prov_id,pedi_id,prod_pedi_cantidad,prod_pedi_precio"
							+ " FROM producto_pedido "
							+ " WHERE prod_pedi_id="
							+ orderProductId + ";");
			Hashtable temp = new Hashtable();
                        System.out.println("Cargando producto");
			//System.out.println(results.size());

			if( results.size() < 1 )
			{
                            results = new Vector();
                            String sql = "SELECT prod_pedi_hist_prod_prov_id AS prod_prov_id, pedi_hist_id AS pedi_id, prod_pedi_hist_cantidad AS prod_pedi_cantidad, " +
                                                           "prod_pedi_hist_precio AS prod_pedi_precio " +
                                                           "FROM producto_pedido_historico " +
                                                           "WHERE prod_pedi_hist_id="+orderProductId+";"; 
                            
                            results = SQLUtilities.query( sql ); 
                            System.out.println(sql);
                            System.out.println("Cargando producto historico");
			}
                        
                        //System.out.println(results.size());
                        if( results.size() > 0 ){
                            temp = (Hashtable) results.elementAt(0);
				this.setTableId(orderProductId);
                                //System.out.println(this.tableId);
				
                                this.setSupplierProductId(((Integer) temp.get("prod_prov_id"))
						.intValue());
                                //System.out.println(this.supplierProductId);
                                
				this.setOrderId(((Integer) temp.get("pedi_id")).intValue());
                                //System.out.println(this.orderId);
                                
				this.setQuantity(((Integer) temp.get("prod_pedi_cantidad"))
						.intValue());
                                //System.out.println(this.quantity);
                                
				this.setOrderPrice(((Double) temp.get("prod_pedi_precio2"))
						.doubleValue());
                                //System.out.println(this.orderPrice);
                        }
                        

		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
		}

		return flag;
	}

	/**
	 * Este método actualiza la información en base de datos
	 */
	public boolean update( Transaction transaction )
	{

		String query = new String("UPDATE producto_pedido "
				+ "SET prod_pedi_cantidad=" + this.getQuantity() + " "
				+ "WHERE prod_pedi_id=" + this.getTableId() + ";");
		transaction.addSql(query);
		return true;
	}

	/**
	 * Almacena la información del producto_pedido en la base de datos usando el
	 * método <CODE>addSql</CODE> de la transacción que recibe
	 * 
	 * @return un booleano que indica si se pudo salvar la información o no
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean saveData( Transaction transaction )
	{
		boolean flag = true;

		this.setTableId(this.hashCode() + getSupplierId()
				+ getSupplierProductId());
		String query = new String("INSERT INTO producto_pedido" + " VALUES ("
				+ this.getTableId() + "," + this.getSupplierProductId() + ","
				+ this.getOrderId() + "," + this.getQuantity() + ","
				+ this.getOrderPrice() + ");");
		transaction.addSql(query);

		return flag;
	}

	/**
	 * Elimina el registro producto_pedido de la base de datos usando el método
	 * <CODE>addSql</CODE> de la transacción que recibe
	 * 
	 * @return un booleano que indica si se pudo eliminar el pedido o no
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean delete( Transaction transaction )
	{
		String query = new String("DELETE " + "FROM producto_pedido "
				+ "WHERE prod_pedi_id=" + this.getTableId() + ";");
		transaction.addSql(query);
		return true;
	}

	/**
	 * Retorna el total correspondiente para este producto en el pedido.
	 * 
	 * @return valor calculado
	 */
	public double calculateValue( )
	{
		double value;
		value = this.getQuantity() * this.getOrderPrice();
		return value;
	}

	/**
	 * Consultor para el at0ributo id.
	 * 
	 * @return Valor del atributo id.
	 */

	/**
	 * Consultor para el atributo orderId.
	 * 
	 * @return Valor de el atributo orderId.
	 */
	public int getOrderId( )
	{
		return orderId;
	}

	/**
	 * Setter para el atributo orderId.
	 * 
	 * @param orderId
	 *            Nuevo valor de el atributo orderId.
	 */
	public void setOrderId( int orderId )
	{
		this.orderId = orderId;
	}

	/**
	 * Getter for property supplierProductId.
	 * 
	 * @return Value of property supplierProductId.
	 */
	public int getSupplierProductId( )
	{
		return supplierProductId;
	}

	/**
	 * Setter for property supplierProductId.
	 * 
	 * @param supplierProductId
	 *            New value of property supplierProductId.
	 */
	public void setSupplierProductId( int supplierProductId )
	{
		this.supplierProductId = supplierProductId;
	}

	/**
	 * Getter for property orderPrice.
	 * 
	 * @return Value of property orderPrice.
	 */
	public double getOrderPrice( )
	{
		return orderPrice;
	}

	/**
	 * Setter for property orderPrice.
	 * 
	 * @param orderPrice
	 *            New value of property orderPrice.
	 */
	public void setOrderPrice( double orderPrice )
	{
		this.orderPrice = orderPrice;
	}

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

	public void makeHistorical( Transaction transaction )
	{

		this.setTableId(this.hashCode() + getSupplierId()
				+ getSupplierProductId());
		String query = new String("INSERT INTO producto_pedido_historico"
				+ " VALUES (" + this.getTableId() + "," + this.getOrderId()
				+ "," + this.getSupplierProductId() + "," + this.getQuantity()
				+ "," + this.getOrderPrice() + ");");
		transaction.addSql(query);
	}

	/**
	 * Carga los datos de la tabla producto_pedido de acuerdo con el id
	 * proporcionado
	 * 
	 * @param orderProductId
	 *            id del producto del pedido
	 * @return boolean que representa el exito del proceso
	 */
	public boolean loadHistoricalOrderProduct( int orderProductId )
	{
		boolean flag = false;
		try
		{
			Vector results = new Vector();
			results = SQLUtilities
					.query("SELECT prod_pedi_hist_prod_prov_id,pedi_hist_id,prod_pedi_hist_cantidad,prod_pedi_hist_precio"
							+ " FROM producto_pedido_historico "
							+ " WHERE prod_pedi_hist_id="
							+ orderProductId
							+ ";");
			Hashtable temp = new Hashtable();
			temp = (Hashtable) results.elementAt(0);

			if( temp != null )
			{
				this.setTableId(orderProductId);
				this.setSupplierProductId(((Integer) temp
						.get("prod_pedi_hist_prod_prov_id")).intValue());
				this
						.setOrderId(((Integer) temp.get("pedi_hist_id"))
								.intValue());
				this
						.setQuantity(((Integer) temp
								.get("prod_pedi_hist_cantidad")).intValue());
				this
						.setOrderPrice(((Double) temp
								.get("prod_pedi_hist_precio2")).doubleValue());
			}

		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
		}

		return flag;
	}
        
        public static void main( String[] args){
            OrderProduct op = new OrderProduct(-1858551308);
            System.out.println( op.calculateValue() );
            System.exit(0);
        }

}