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;

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

/**
 * Esta clase representa la tabla operador_logístico 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
 * 
 * @authorDeLaPlantilla Mario Linares Vásquez
 * @author Andrés Romero Rodríguez
 */
public class LogisticOperator
{
	/**
	 * id del operador logístico
	 */
	private int id;

	/**
	 * nombre del operador logístico
	 */
	private String name;

	/**
	 * dirección del operador
	 */
	private String address;

	/**
	 * nombre de una persona de contacto del operador logístico
	 */
	private String contact;

	/**
	 * número telefónico del operador
	 */
	private String phoneNumber;

	/**
	 * correo electrónico del operador
	 */
	private String email;

	/**
	 * número de identificación de la ciudad del operador
	 */
	private int cityId;

	/**
	 * nombre de la ciudad
	 */
	private String cityName;

	/**
	 * Constructor por omisión de la clase. Se debe usar para el caso de
	 * insertar un nuevo operador logístico en la base de datos
	 */
	public LogisticOperator( )
	{
		// do nothing
	}

	/**
	 * Constructor que recibe el id del operador logístico 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 operatorId con el fin de cargar los datos propios del operador
	 * 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 operatorId
	 *            int que representa el id del operador logístico en la base de
	 *            datos
	 */
	public LogisticOperator( int operatorId)
	{
		loadData(operatorId);
	}

	/**
	 * 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 operatorId
	 *            id del operador logístico
	 */
	public boolean loadData( int operatorId )
	{
		boolean respuesta = false;

		id = operatorId;

		String sql = "SELECT ciud_id, oper_logi_nombre, oper_logi_direccion, oper_logi_contacto"
				+ ", oper_logi_telefono, oper_logi_email FROM operador_logistico"
				+ " WHERE oper_logi_id=" + operatorId + ";";

		try
		{
			Vector res = SQLUtilities.query(sql);
			Hashtable datos = (Hashtable) res.elementAt(0);

			name = (String) datos.get("oper_logi_nombre");
			address = (String) datos.get("oper_logi_direccion");
			contact = (String) datos.get("oper_logi_contacto");
			phoneNumber = (String) datos.get("oper_logi_telefono");
			email = (String) datos.get("oper_logi_email");
			cityId = ((Integer) datos.get("ciud_id")).intValue();

			// para obtener el nombre de la ciudad
			sql = "SELECT ciud_nombre FROM ciudad WHERE ciud_id=" + cityId
					+ ";";
			res = SQLUtilities.query(sql);
			datos = (Hashtable) res.elementAt(0);
			cityName = (String) datos.get("ciud_nombre");

			respuesta = true;
		}
		catch (QueryException ex)
		{
			respuesta = false;
		}
		catch (Exception e)
		{
			respuesta = false;
		}

		return respuesta;
	}

	/**
	 * Este método guarda los atributos del operador logístico 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
	 * operador_logistico debe construir una consulta SQL de tipo <B>insert </B>
	 * y la adiciona a la transacción usando 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 )
	{
		id = this.hashCode();

		String sql = "INSERT INTO operador_logistico (oper_logi_id, ciud_id, "
				+ "oper_logi_nombre, oper_logi_direccion, oper_logi_contacto, "
				+ "oper_logi_telefono, oper_logi_email) VALUES( " + id + ", "
				+ cityId + ", \'" + name + "\', \'" + address + "\', " + "\'"
				+ contact + "\', \'" + phoneNumber + "\', \'" + email + "\');";

		transaction.addSql(sql);
		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo update con el fin de actualizar los
	 * campos del operador logístico modificados a través de los métodos
	 * setter.Para actualizar los datos en la tabla operador_logistico debe
	 * construir una consulta SQL de tipo <B>update </B> y la adiciona a la
	 * transacción usando 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 )
	{
		boolean res = false;
		if( id != 0 )
		{
			String sql = "UPDATE operador_logistico SET " + "ciud_id=" + cityId
					+ ", oper_logi_nombre=\'" + name + "\'"
					+ ", oper_logi_direccion=\'" + address + "\'"
					+ ", oper_logi_contacto=\'" + contact + "\'"
					+ ", oper_logi_telefono=\'" + phoneNumber + "\'"
					+ ", oper_logi_email=\'" + email + "\'"
					+ "WHERE oper_logi_id=" + id + ";";
			transaction.addSql(sql);
			res = true;
		}
		else
		{
			res = false;
		}
		return res;
	}

	/**
	 * Realiza una consulta SQL de tipo delete con el fin de eliminar el
	 * operador logístico 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 operador_logistico debe construir una consulta SQL de tipo
	 * <B>deletete </B> y la adiciona a la transacción usando 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 )
	{
		boolean res = false;
		if( id != 0 )
		{
			String sql = "DELETE FROM operador_logistico WHERE oper_logi_id="
					+ id + ";";
			transaction.addSql(sql);
			res = true;
		}
		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 address.
	 * 
	 * @return Valor del atributo address.
	 */
	public String getAddress( )
	{
		return address;
	}

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

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

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

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

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

	/**
	 * Consultor para el atributo email.
	 * 
	 * @return Valor del atributo email.
	 */
	public 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;
	}

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

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

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

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

}