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;

/*
 * Store.java
 *
 * Created on 12 de agosto de 2004, 16:46 
 */

/**
 * Esta clase representa la tabla establecimiento 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 Store
{
	/**
	 * id del establecimiento
	 */
	private int id;

	/**
	 * nombre del establecimiento
	 */
	private String name;

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

	/**
	 * calle donde se encuentra el establecimiento
	 */
	private int street;

	/**
	 * carrera donde se encunentra el establecimiento
	 */
	private int avenue;

	/**
	 * orientación de la calle donde se encuentra el establecimiento (N,S,W,E)
	 */
	private String streetOrientation;

	/**
	 * orientación de la carrera donde se encuentra el establecimiento (N,S,W,E)
	 */
	private String avenueOrientation;

	/**
	 * persona de contacto número 1
	 */
	private String contact1;

	/**
	 * persona de contacto número 2
	 */
	private String contact2;

	/**
	 * teléfono número 1
	 */
	private String phoneNumber1;

	/**
	 * teléfono número 2
	 */
	private String phoneNumber2;

	/**
	 * área del establecimiento (metros cuadrados)
	 */
	private double storeArea;

	/**
	 * puntos de pago al interior del establecimiento
	 */
	private int payPlaces;

	/**
	 * área de bodega en el establecimiento (metros cuadrados)
	 */
	private double wareHouseArea;

	/**
	 * id del
	 */
	private int neighbourhood;

	/**
	 * estrato social
	 */
	private int stratum;

	private String gln;

	/**
	 * id de la empresa
	 */
	private int companyId;

	/**
	 * Constructor por omisión de la clase. Se debe usar para el caso de
	 * insertar un nuevo establecimiento en la base de datos.
	 */
	public Store( )
	{
	}

	/**
	 * Constructor que recibe el id del establecimiento 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 storeId con el fin de cargar los datos propios de ese
	 * establecimiento 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 storeId
	 *            int que representa el id del establecimiento
	 */
	public Store( int storeId)
	{
		this();
		loadData(storeId);
	}

	/**
	 * Este método carga de la tabla establecimiento 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 storeId
	 *            identificador del establecimiento
	 */
	public boolean loadData( int storeId )
	{
		boolean respuesta = false;
		String sql = "SELECT barr_id, empr_id, esta_nombre, esta_direccion, esta_calle, "
				+ "esta_carrera, esta_orientacion_calle, esta_orientacion_carrera, "
				+ "esta_contacto1, esta_contacto2, esta_telefono1, esta_telefono2, "
				+ "esta_area_tienda, esta_puntos_pago, esta_area_bodega, esta_estrato, "
				+ "esta_gln FROM establecimiento WHERE esta_id="
				+ storeId
				+ ";";

		try
		{
			Vector res = SQLUtilities.query(sql);
			if( res.size() > 0 )
			{
				Hashtable datos = (Hashtable) res.elementAt(0);
				id = storeId;
				name = (String) datos.get("esta_nombre");
				address = (String) datos.get("esta_direccion");
				street = ((Integer) datos.get("esta_calle")).intValue();
				avenue = ((Integer) datos.get("esta_carrera")).intValue();
				streetOrientation = (String) datos
						.get("esta_orientacion_calle");
				avenueOrientation = (String) datos
						.get("esta_orientacion_carrera");
				contact1 = (String) datos.get("esta_contacto1");
				contact2 = (String) datos.get("esta_contacto2");
				phoneNumber1 = (String) datos.get("esta_telefono1");
				phoneNumber2 = (String) datos.get("esta_telefono2");
				storeArea = ((Double) datos.get("esta_area_tienda2"))
						.doubleValue();
				payPlaces = ((Integer) datos.get("esta_puntos_pago"))
						.intValue();
				wareHouseArea = ((Double) datos.get("esta_area_bodega2"))
						.doubleValue();
				neighbourhood = ((Integer) datos.get("barr_id")).intValue();
				stratum = ((Integer) datos.get("esta_estrato")).intValue();
				gln = (String) datos.get("esta_gln");
				companyId = ((Integer) datos.get("empr_id")).intValue();

				respuesta = true;
			}
			else
			{
				respuesta = false;
			}

		}
		catch (QueryException ex)
		{
			respuesta = false;
		}
		return respuesta;
	}

	/**
	 * Este método guarda los atributos del establecimiento 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 establecimiento 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
	 *            transacción que se está ejecutando
	 */
	public boolean saveData( Transaction transaction )
	{
		id = this.hashCode();

		String sql = "INSERT INTO establecimiento (" + "esta_id, "
				+ "barr_id, " + "empr_id, " + "esta_nombre, "
				+ "esta_direccion, " + "esta_calle, " + "esta_carrera, "
				+ "esta_orientacion_calle, " + "esta_orientacion_carrera, "
				+ "esta_contacto1, " + "esta_contacto2, " + "esta_telefono1, "
				+ "esta_telefono2, " + "esta_area_tienda, "
				+ "esta_puntos_pago, " + "esta_area_bodega, "
				+ "esta_estrato, " + "esta_gln" + ") VALUES(" + id + ", "
				+ neighbourhood + ", " + companyId + ", " + "\'" + name
				+ "\', " + "\'" + address + "\', " + street + ", " + avenue
				+ ", " + "\'" + streetOrientation + "\', " + "\'"
				+ avenueOrientation + "\', " + "\'" + contact1 + "\', " + "\'"
				+ contact2 + "\', " + "\'" + phoneNumber1 + "\', " + "\'"
				+ phoneNumber2 + "\', " + storeArea + ", " + payPlaces + ", "
				+ wareHouseArea + ", " + stratum + ", " + "\'" + gln + "\'"
				+ ");";

		transaction.addSql(sql);
		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo update con el fin de actualizar los
	 * campos del establecimiento modificados a través de los métodos
	 * setter.Para actualizar los datos en la tabla establecimiento 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
	 *            transacción que se está ejecutando
	 */
	public boolean update( Transaction transaction )
	{
		String sql = "UPDATE establecimiento SET " + "barr_id=" + neighbourhood
				+ ", " + "empr_id=" + companyId + ", " + "esta_nombre=\'"
				+ name + "\', " + "esta_direccion=\'" + address + "\', "
				+ "esta_calle=" + street + ", " + "esta_carrera=" + avenue
				+ ", " + "esta_orientacion_calle=\'" + streetOrientation
				+ "\', " + "esta_orientacion_carrera=\'" + avenueOrientation
				+ "\', " + "esta_contacto1=\'" + contact1 + "\', "
				+ "esta_contacto2=\'" + contact2 + "\', " + "esta_telefono1=\'"
				+ phoneNumber1 + "\', " + "esta_telefono2=\'" + phoneNumber2
				+ "\', " + "esta_area_tienda=" + storeArea + ", "
				+ "esta_puntos_pago=" + payPlaces + ", " + "esta_area_bodega="
				+ wareHouseArea + ", " + "esta_estrato=" + stratum + ", "
				+ "esta_gln=\'" + gln + "\' " + "WHERE esta_id=" + id + ";";
		transaction.addSql(sql);
		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo delete con el fin de eliminar el
	 * establecimiento de la base de datos cuando se creo la instancia con el
	 * constructor que recibe el id como parámetro y la adiciona a la
	 * transacción con el método <CODE>addSql</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de boorado
	 * @param transaction
	 *            transacción que se está ejecutando
	 */
	public boolean delete( Transaction transaction )
	{
		boolean flag = false;
		String query = "SELECT pedi_id FROM pedido WHERE esta_id=" + this.id
				+ ";";

		try
		{
			Vector temp = new Vector();
			temp = SQLUtilities.query(query);
			if( temp.size() == 0 )
			{
				flag = true;
			}

		}

		catch (QueryException qe)
		{
			System.out.println("QueryException en Store-->" + qe);
			qe.printStackTrace();
			flag = false;
		}

		if( flag )
		{
			String sql = "DELETE FROM comunidad_establecimiento WHERE esta_id="
					+ id + ";";
			transaction.addSql(sql);
			sql = "DELETE FROM establecimiento WHERE esta_id=" + id + ";";
			transaction.addSql(sql);
		}

		return flag;
	}

	/**
	 * Este método permite obtener el nombre de la empresa a la cual pertenece
	 * el minorista, será utilizado para la construcción del listado <CODE>
	 * StoreListViewSupplier</CODE>
	 * 
	 * @param storeId
	 *            Identificador del establecimiento
	 * @return Cadena con el nombre de la empresa a la que pertenece el
	 *         establecimiento.
	 */
	public static String getCompanyName( int storeId )
	{

		String sql = "SELECT empresa.empr_nombre_comercial "
				+ "FROM empresa,establecimiento "
				+ "WHERE empresa.empr_id=establecimiento.empr_id AND "
				+ "establecimiento.esta_id=" + storeId + ";";

		String companyName = "";
		Vector result = new Vector();
		Hashtable aux;

		try
		{

			result = SQLUtilities.query(sql);
			aux = (Hashtable) result.elementAt(0);
			companyName = (String) aux.get("empr_nombre_comercial");

		}
		catch (QueryException qe)
		{
			//System.out.println("Query error: "+qe);
		}

		return companyName;
	};

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

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

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

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

	/**
	 * Consultor del atributo address.
	 * 
	 * @return Valor del atributo address.
	 */
	public java.lang.String getAddress( )
	{
		return address;
	}

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

	/**
	 * Consultor del atributo street.
	 * 
	 * @return Valor del atributo street.
	 */
	public int getStreet( )
	{
		return street;
	}

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

	/**
	 * Consultor del atributo avenue.
	 * 
	 * @return Valor del atributo avenue.
	 */
	public int getAvenue( )
	{
		return avenue;
	}

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

	/**
	 * Consultor del atributo streetOrientation.
	 * 
	 * @return Valor del atributo streetOrientation.
	 */
	public java.lang.String getStreetOrientation( )
	{
		return streetOrientation;
	}

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

	/**
	 * Consultor del atributo avenueOrientation.
	 * 
	 * @return Valor del atributo avenueOrientation.
	 */
	public java.lang.String getAvenueOrientation( )
	{
		return avenueOrientation;
	}

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

	/**
	 * Consultor del atributo contact1.
	 * 
	 * @return Valor del atributo contact1.
	 */
	public java.lang.String getContact1( )
	{
		return contact1;
	}

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

	/**
	 * Consultor del atributo contact2.
	 * 
	 * @return Valor del atributo contact2.
	 */
	public java.lang.String getContact2( )
	{
		return contact2;
	}

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

	/**
	 * Consultor del atributo phoneNumber1.
	 * 
	 * @return Valor del atributo phoneNumber1.
	 */
	public java.lang.String getPhoneNumber1( )
	{
		return phoneNumber1;
	}

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

	/**
	 * Consultor del atributo phoneNumber2.
	 * 
	 * @return Valor del atributo phoneNumber2.
	 */
	public java.lang.String getPhoneNumber2( )
	{
		return phoneNumber2;
	}

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

	/**
	 * Consultor del atributo storeArea.
	 * 
	 * @return Valor del atributo storeArea.
	 */
	public double getStoreArea( )
	{
		return storeArea;
	}

	/**
	 * Modificador para el atributo storeArea.
	 * 
	 * @param storeArea
	 *            Nuevo valor para el atributo storeArea.
	 */
	public void setStoreArea( double storeArea )
	{
		this.storeArea = storeArea;
	}

	/**
	 * Consultor del atributo payPlaces.
	 * 
	 * @return Valor del atributo payPlaces.
	 */
	public int getPayPlaces( )
	{
		return payPlaces;
	}

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

	/**
	 * Consultor del atributo wareHouseArea.
	 * 
	 * @return Valor del atributo wareHouseArea.
	 */
	public double getWareHouseArea( )
	{
		return wareHouseArea;
	}

	/**
	 * Modificador para el atributo wareHouseArea.
	 * 
	 * @param wareHouseArea
	 *            Nuevo valor para el atributo wareHouseArea.
	 */
	public void setWareHouseArea( double wareHouseArea )
	{
		this.wareHouseArea = wareHouseArea;
	}

	/**
	 * Consultor del atributo neighbourhood.
	 * 
	 * @return Valor del atributo neighbourhood.
	 */
	public int getNeighbourhood( )
	{
		return neighbourhood;
	}

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

	/**
	 * Consultor del atributo stratum.
	 * 
	 * @return Valor del atributoy stratum.
	 */
	public int getStratum( )
	{
		return stratum;
	}

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

	/**
	 * Getter for property gln.
	 * 
	 * @return Value of property gln.
	 */
	public java.lang.String getGln( )
	{
		return gln;
	}

	/**
	 * Setter for property gln.
	 * 
	 * @param gln
	 *            New value of property gln.
	 */
	public void setGln( java.lang.String gln )
	{
		this.gln = gln;
	}

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

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

        public String toString2( )
	{
                StringBuffer store = new StringBuffer();
                store.append("\nNombre: "+this.getName());
                store.append("\nDireccion: "+this.getAddress());
                store.append("\nTelefono: "+this.getPhoneNumber1());
                store.append("\nContacto: "+this.getContact1());
		return store.toString();
        }
        
	public String toString( )
	{       
		return this.getName();
	}
}