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;

/*
 * PaymentMethod.java
 *
 * Created on 11 de agosto de 2004, 19:41 
 */

/**
 * Esta clase representa la tabla forma_pago de la base de datos y
 * encapsula cada una de las operaciones que sobre esta se puedan realizar :
 * inserci�, actualizaci�, eliminaci�, consulta
 * 
 * @authorDeLaPlantilla Mario Linares V�quez
 * @author Juan Ernesto Peña Kaltekis
 */
public class PaymentMethod
{
	/**
	 * id de la forma de pago
	 */
	private int id;

	/**
	 * nombre de la forma de pago
	 */
	private String name;

	/**
	 * Descuento para este tipo de pago
	 */
	private float discount;

	/**
	 * Còdigo interno de la forma de pago
	 */
	private String internalCode;

	
	/**
	 * Identificador del proveedor que creò la forma de pago
	 */
	private int  supplierId;
	

	/**
	 * Constructor por omisiòn� de la clase. 
	 */
	public PaymentMethod( )
	{
		// do nothing
	}

	/**
	 * Constructor que recibe el id de la forma de pago en la base de datos.
	 * Se debe usar en el caso de actualizaciones, borrado y consulta. Este
	 * constructor llama a la funci� miembro <CODE>loadData</CODE> con el
	 * par�etro methodPaymentId con el fin de cargar los datos propios de la forma de pago
	 * que residen en la base de datos. Al usar este constructor si se desea
	 * modificar el valor de algn campo se deben utilizar los m�odos
	 * consultores (setter).
	 * 
	 * @param methodPaymentId
	 *            int que representa el id de la forma de pago en la base de
	 *            datos
	 */
	public PaymentMethod( int methodPaymentId)
	{
		loadData(methodPaymentId);
	}

	/**
	 * Este m�odo carga de la tabla forma_pago de la base de datos todos
	 * los valores de los campos en los atributos de la clase, a trav� del
	 * m�odo <CODE>query</CODE> de la clase <CODE>SQLUtilities</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de carga de los datos
	 * @param methodPaymentId
	 *            id de la forma de pago
	 */
	public boolean loadData( int methodPaymentId )
	{
		boolean response = false;

		this.id = methodPaymentId;

		String sql = "SELECT empr_id, form_pago_nombre, form_pago_descuento, form_pago_codigo_interno " 
			     + "FROM forma_pago "
			     + "WHERE form_pago_id=" + methodPaymentId + ";";

                //System.out.println( "Load:" + sql );
                
		try
		{
			Vector res = SQLUtilities.query(sql);
                        if( res.size() > 0 ){
                            
                            Hashtable data = (Hashtable) res.elementAt(0);

                            this.name = (String) data.get("form_pago_nombre");
                            this.discount = ( ( Double ) data.get("form_pago_descuento2") ).floatValue();
                            this.internalCode = ( String ) data.get("form_pago_codigo_interno");
                            this.supplierId = ( (Integer) data.get("empr_id") ).intValue();

                            //System.out.println( "supId:" + this.supplierId + " name:" +this.getName() + " discount:" +this.getDiscount() + " codInterno:" +this.getInternalCode() );

                            response = true;
                        }
			
		}
		catch (QueryException ex)
		{
			//System.out.println(ex.getMessage());
                        ex.printStackTrace();
			response = false;
		}
		catch (Exception e)
		{
			//System.out.println(e.getMessage());
                        e.printStackTrace();
			response = false;
		}

		return response;
	}

	/**
	 * Este m�odo guarda los atributos de la forma de pago en la base de
	 * datos. Se debe usar solo cuando se ha creado una instancia con el
	 * constructor por omisi�. Para almacenar los datos en la tabla
	 * forma_pago debe construir una consulta SQL de tipo <B>insert </B>
	 * y la adiciona a la transacci� usando el m�odo <CODE>addSql</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de inserci�
	 * @param transaction
	 *            la transacci� que se est�ejecutando
	 */
	public boolean saveData( Transaction transaction )
	{
		id = this.hashCode();

		String sql = "INSERT INTO forma_pago " +
				"(form_pago_id, empr_id, form_pago_nombre, form_pago_descuento, form_pago_codigo_interno) " +
				"VALUES(" + this.id + "," + 
				 this.supplierId + "," +
				 "\'" + this.name + "\'," +
				 this.discount + "," +
				 "\'" + this.internalCode + "\'" +
				");";

                //System.out.println( "Save Data:" + sql );
		transaction.addSql(sql);
		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo update con el fin de actualizar los
	 * campos de la forma de pago modificados a trav� de los m�odos
	 * setter.Para actualizar los datos en la tabla forma_pago debe
	 * construir una consulta SQL de tipo <B>update </B> y la adiciona a la
	 * transacci� usando el m�odo <CODE>addSql</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de actualizaci�
	 * @param transaction
	 *            la transacci� que se est�ejecutando
	 */
	public boolean update( Transaction transaction )
	{
		boolean res = false;
		if( id != 0 )
		{
			String sql = "UPDATE forma_pago SET " + 
					"form_pago_nombre=\'" + this.name + "\', " + 
					"form_pago_descuento=" + this.discount + ", " + 
					"form_pago_codigo_interno=\'" + this.internalCode + "\' " +
					"WHERE form_pago_id=" + this.id + ";";
                        
			transaction.addSql(sql);
			res = true;
		}
		else
		{
			res = false;
		}
		return res;
	}

	/**
	 * Realiza una consulta SQL de tipo delete con el fin de eliminar la
	 * forma de pago de la base de datos cuando se creo la instancia con el
	 * constructor que recibe el id como par�etro.Para eliminar los datos en la
	 * tabla forma_pago debe construir una consulta SQL de tipo
	 * <B>deletete </B> y la adiciona a la transacci� usando el m�odo <CODE>
	 * addSql</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de borrado
	 * @param transaction
	 *            la transacci� que se est�ejecutando
	 */
	public boolean delete( Transaction transaction )
	{
		boolean res = false;
		if( id != 0 )
		{
                        /*
			Vector result = new Vector();
                        Vector result2 = new Vector();
                        boolean flag = false;
                        
                        try{
                            
                            result = SQLUtilities.query( "SELECT empr_id FROM minorista_forma_pago WHERE form_pago_id="+this.id+";" );
                            result2 = SQLUtilities.query( "SELECT comu_id FROM comunidad_forma_pago WHERE form_pago_id="+this.id+";" );
                            
                            flag = true;
                            
                        }catch( QueryException qe ){
                        
                            System.out.println( "Query Error: " +qe.getMessage() );
                            flag = false;
                            
                        } 
                        
                        System.out.println( "Result1: " + result.size()  + " Result2: " + result2.size() );
                        
                    
                        if( flag && result.size() ==  0 && result2.size() == 0 ){
                            
                            String sql = "DELETE FROM forma_pago WHERE form_pago_id="+ this.id + ";";
                            String sql2 = "DELETE FROM minorista_forma_pago WHERE form_pago_id="+this.id+";";
                            String sql3 = "DELETE FROM comunidad_forma_pago WHERE form_pago_id="+this.id+";";

                            transaction.addSql( sql );
                            transaction.addSql( sql3 );
                            transaction.addSql( sql2 );
                            
                            
                            res = true;
                            
                        }
                        res = false;
                         
                         */
                        String sql = "DELETE FROM forma_pago WHERE form_pago_id="+ this.id + ";";
                        String sql2 = "DELETE FROM minorista_forma_pago WHERE form_pago_id="+this.id+";";
                        String sql3 = "DELETE FROM comunidad_forma_pago WHERE form_pago_id="+this.id+";";

                        transaction.addSql( sql3 );
                        transaction.addSql( sql2 );
                        transaction.addSql( sql );
		}
		else
		{
			res = false;
		}
                
                return res;
	}

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

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

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

	/**
	 * Modificador para el atributo name.
	 * 
	 * @param name
	 *            Nuevo valor del atributo name.
	 */
	public void setName( java.lang.String name )
	{
		this.name = name;
	}

	/**
	 * Consultor para el atributo discount.
	 * 
	 * @return Valor del atributo discount.
	 */
	public float getDiscount( )
	{
		return discount;
	}

	/**
	 * Modificador para el atributo discount.
	 * 
	 * @param discount
	 *            Nuevo valor del atributo discount.
	 */
	public void setDiscount( float discount )
	{
		this.discount = discount;
	}

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

	/**
	 * Modificador para el atributo internalCode.
	 * 
	 * @param internalCode
	 *            Nuevo valor del atributo internalCode.
	 */
	public void setInternalCode( java.lang.String internalCode )
	{
		this.internalCode = internalCode;
	}

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

	/**
	 * Modificador para el atributo supplierId.
	 * 
	 * @param supplierId
	 *            Nuevo valor del atributo supplierId.
	 */
	public void setSupplierId( int supplierId )
	{
		this.supplierId = supplierId; 
	}
        
        
        public void addPaymentMethod( int optionId, int option, Transaction t ){
        
            String sql = "";
            int key = this.hashCode() + this.internalCode.hashCode();
            //System.out.println("key: " + key);
             
            if( option == 1 ){
            
                sql = "INSERT INTO minorista_forma_pago ( mino_form_pago_id, form_pago_id, empr_id )VALUES("+key+","+this.id+","+optionId+");";
                
            }else{
            
                sql = "INSERT INTO comunidad_forma_pago (comu_form_pago_id, form_pago_id, comu_id ) VALUES("+key+","+this.id+","+optionId+");";
                
            }
            
            //System.out.println( sql );
            t.addSql( sql );
            
        }
        
        public boolean exist( ){
            
            Vector result = new Vector();
            boolean response = false;
            String sql = "SELECT * " +
                         "FROM forma_pago " +
                         "WHERE empr_id="+this.supplierId+ " AND (" +
                         "form_pago_nombre='"+this.name+"' OR " +
                         "form_pago_codigo_interno='"+this.internalCode+"');";
            try{
                
                result = SQLUtilities.query( sql );
                if( result.size() > 0 ){
                    response = true;
                }
                
            }catch( QueryException qe ){
                System.out.println( qe.getMessage() );
            }
        
            return response;
            
        }
        
        public void removePaymentMethod( int optionId, int option, Transaction t ){
        
            String sql = "";
            
            if( option == 1 ){
            
                sql = "DELETE FROM minorista_forma_pago WHERE form_pago_id="+this.id+" AND empr_id="+optionId+";";
                
            }else{
            
                sql = "DELETE FROM comunidad_forma_pago WHERE form_pago_id="+this.id+" AND comu_id="+optionId+";";
                
            }
            
            //System.out.println( sql );
            
            t.addSql( sql );
            
        }

}