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;

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

/**
 * Esta clase representa la tabla categoria_reclamos 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 ComplaintCategory
{
	/**
	 * id de la categoría de reclamo
	 */
	private int id;

	/**
	 * nombre descriptivo de la categoría de reclamo
	 */
	private String name;

	/**
	 * descripción de la categoría de reclamo
	 */
	private String description;

	/**
	 * email destino para los reclamos
	 */
	private String email;

	/**
	 * Constructor por omisión de la clase. Se debe utilizar en el caso de que
	 * se vaya crear una nueva categoría en la base de datos.
	 */
	public ComplaintCategory( )
	{
		// TODO: implement
	}

	/**
	 * Constructor que recibe el id de la categforía 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 de esa categoría 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 de la factura en la base de datos
	 */
	public ComplaintCategory( int id)
	{
		// TODO: implement
		this.loadData(id);
	}

	/**
	 * Este método carga de la tabla categoria_reclamo 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 de la categoría de reclamo
	 */
	public boolean loadData( int id )
	{
		// TODO: implement
		Vector result = new Vector();
		String sql = "SELECT cate_recl_id, cate_recl_nombre, cate_recl_descripcion, cate_recl_email "
				+ "FROM categoria_reclamo " + "WHERE cate_recl_id=" + id + ";";
		try
		{
			result = SQLUtilities.query(sql);

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

			this
					.setId(((Integer) complaintData.get("cate_recl_id"))
							.intValue());
			this.setName((String) complaintData.get("cate_recl_nombre"));
			this.setDescription((String) complaintData
					.get("cate_recl_descripcion"));
			this.setEmail((String) complaintData.get("cate_recl_email"));

		}
		catch (QueryException qe)
		{
			return false;
		}

		return true;
	}

	/**
	 * Este método guarda los atributos de la categogía 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 categoria_reclamo debe
	 * construir una consulta SQL de tipo <B>insert </B> y adicionarla a la
	 * transacción que recibe como parámetro 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 = this.hashCode();
		String sql = "INSERT INTO categoria_reclamo VALUES(" + nextId + ",\'"
				+ this.getName() + "\',\'" + this.getDescription() + "\',\'"
				+ this.getEmail() + "\');";

		transaction.addSql(sql);
		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo update con el fin de actualizar los
	 * campos de la categoría modificados a través de los métodos setter. Para
	 * actualizar los datos en la tabla categoria_reclamo debe construir una
	 * consulta SQL de tipo <B>update </B> y adicionarla a la transacción que
	 * recibe como parámetro 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 categoria_reclamo SET cate_recl_nombre=\'"
				+ this.getName() + "\',cate_recl_descripcion=\'"
				+ this.getDescription() + "\',cate_recl_email=\'"
				+ this.getEmail() + "\' " + "WHERE cate_recl_id="
				+ this.getId() + ";";

		transaction.addSql(sql);

		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo delete con el fin de eliminar la
	 * categoría 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 categoria_reclamo debe construir una consulta SQL de tipo
	 * <B>deletete </B> y adicionarla a la transacción que recibe como parámetro
	 * 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 categoria_reclamo WHERE cate_recl_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 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 description.
	 * 
	 * @return Valor del atributo description.
	 */
	public 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;
	}

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

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

	public String toString( )
	{
		return this.getName();
	}
}