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;

/*
 * Parameter.java
 *
 * Created on 12 de agosto de 2004, 15:17 
 */

/**
 * Esta clase representa la tabla parametros_sistema de la base de datos y
 * encapsula cada una de las operaciones que sobre esta se puedan realizar :
 * inserción, actualización, eliminación, consulta
 * 
 * @author Mario Linares Vásquez
 */

public class Parameter
{
	/**
	 * id dle parámetro del sistema
	 */
	private int id;

	/**
	 * nombre del parámetro
	 */
	private String name;

	/**
	 * valor para el parámetro
	 */
	private String value;

	/**
	 * descripción del parámetro
	 */
	private String description;

	/**
	 * Constructor por omisión de la clase. Se debe usar para el caso de
	 * insertar un nuevo parámetro en la base de datos
	 */
	public Parameter( )
	{
		// TODO: implement
	}

	/**
	 * Constructor que recibe el id del parámetro del sistema en la base de
	 * datos. Se debe usar en el caso de actualizaciones, borrado y consulta.
	 * Este constructor llama a la función miembro <CODE>loadData</CODE> con
	 * el parámetro id con el fin de cargar los datos propios del parámetro del
	 * sistema que residen en la base de datos. Al usar este constructor si se
	 * desea modificar el valor de algún campo se deben utilizar los métodos
	 * consultores (setter).
	 * 
	 * @param id
	 *            int que representa el id del parámetro del sistema en la base
	 *            de datos
	 */
	public Parameter( int id)
	{
		// TODO: implement
		this.loadData(id);
	}

	/**
	 * Este método carga de la tabla parametros_sistema de la base de datos
	 * todos los valores de los campos en los atributos de la clase, a través
	 * del método <CODE>query</CODE> de la clase <CODE>SQLUtilities</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de carga de los datos
	 * @param id
	 *            identificador del parámetro del sistema
	 */
	public boolean loadData( int id )
	{
		// TODO: implement
		Vector result = new Vector();
		String sql = "SELECT para_sist_id, para_sist_nombre, para_sist_valor, para_sist_descripcion "
				+ "FROM parametros_sistema " + "WHERE para_sist_id=" + id + ";";
		try
		{
			result = SQLUtilities.query(sql);

			Hashtable parameter = (Hashtable) result.elementAt(0);

			this.setId(((Integer) parameter.get("para_sist_id")).intValue());
			this.setName((String) parameter.get("para_sist_nombre"));
			this.setValue((String) parameter.get("para_sist_valor"));
			this
					.setDescription((String) parameter
							.get("para_sist_descripcion"));

		}
		catch (QueryException qe)
		{
			return false;
		}

		return true;
	}

	/**
	 * Este método guarda los atributos del parámetro en la base de datos. Se
	 * debe usar solo cuando se ha creado una instancia con el constructor por
	 * omisión. Para almacenar los datos en la tabla parametros_sistema debe
	 * construir una consulta SQL de tipo <B>insert </B> y la adiciona a la
	 * transacción con el método <CODE>addSql</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de inserción
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean saveData( Transaction transaction )
	{
		int nextId;

		nextId = this.hashCode();

		String sql = "INSERT INTO parametros_sistema VALUES(" + nextId + ",\'"
				+ this.getName() + "\'," + this.getValue() + ",\'"
				+ this.getDescription() + "\');";

		transaction.addSql(sql);
		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo update con el fin de actualizar los
	 * campos del parámetro del sistema modificados a través de los métodos
	 * setter.Para actualizar los datos en la tabla parametros_sistema debe
	 * construir una consulta SQL de tipo <B>update </B> y la adiciona a la
	 * transacción con el método <CODE>addSql</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de actualización
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean update( Transaction transaction )
	{
		// TODO: implement
		String sql = "UPDATE parametros_sistema SET para_sist_nombre=\'"
				+ this.getName() + "\',para_sist_valor=\'" + this.getValue()
				+ "\',para_sist_descripcion=\'" + this.getDescription() + "\' "
				+ "WHERE para_sist_id=" + this.getId() + ";";

		transaction.addSql(sql);

		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo delete con el fin de eliminar el
	 * parámetro de la base de datos cuando se creo la instancia con el
	 * constructor que recibe el id como parámetro.Para eliminar los datos en la
	 * tabla parametros_sistema debe construir una consulta SQL de tipo
	 * <B>deletete </B> y la adiciona a la transacción con el método <CODE>
	 * addSql</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de borrado
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean delete( Transaction transaction )
	{
		// TODO: implement
		String sql = "DELETE FROM parametros_sistema WHERE para_sist_id="
				+ this.getId() + ";";
		transaction.addSql(sql);

		return true;
	}

	/**
	 * 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 java.lang.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 value.
	 * 
	 * @return Valor del atributo value.
	 */
	public String getValue( )
	{
		return value;
	}

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

	/**
	 * Consultor para el atributo description.
	 * 
	 * @return Valor del atributo description.
	 */
	public java.lang.String getDescription( )
	{
		return description;
	}

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

	public static void main( String args[] )
	{
		Parameter p = new Parameter(4);
		p.setName("el nuevo");
		p.setValue("34");
		p.setDescription("sirvió");
		Transaction t = new Transaction();
		p.delete(t);
		t.execute();
		// System.out.println("nombre: "+ s);
		// System.out.println("valor: "+ d);
	}

}