/*
 * Comunity.java
 *
 * Created on 24 de agosto de 2004, 12:36
 */

package com.fenalco.entities;

import java.sql.Date;
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;

/**
 * Representa una comunidad
 * 
 * @author andres
 */
public class Community
{

	/**
	 * Identificador de cada comunidad
	 */
	private int id;

	/**
	 * Proveedor al que pertenece la comunidad
	 */
	private int supplierId;

	/**
	 * Nombre que el proveedor le ha dado a la comunidad
	 */
	private String name;

	/**
	 * Constructor por omisión que crea una comunidad vacia
	 */
	public Community( )
	{
	}

	/**
	 * Constructor que crea una comunidad a partir de su id en la base de datos
	 * 
	 * @param cId
	 *            Identificador de la comunidad
	 */
	public Community( int cId)
	{
		id = cId;
		loadData(id);
	}

	private boolean loadData( int comId )
	{
		String sql = "SELECT empr_id, comu_nombre FROM comunidad "
				+ "WHERE comu_id=" + comId + ";";

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

			id = comId;
			supplierId = ((Integer) datos.get("empr_id")).intValue();
			name = (String) datos.get("comu_nombre");

			return true;
		}
		catch (QueryException e)
		{
			//System.out.println("Query Error: "+e);
			return false;
		}
	}

	/**
	 * Almacena la información de la comunidad en la base de datos construyendo
	 * el sql y pasandoselo a la transaccion
	 * 
	 * @param transaction
	 *            la transacción que se está ejecutando
	 * @return booleano que indica si se pudo ejecutar la operación o no
	 */
	public boolean saveData( Transaction transaction )
	{
		id = this.hashCode();
		String sql = "INSERT INTO comunidad (comu_id, empr_id, comu_nombre)"
				+ "VALUES(" + id + ", " + supplierId + ", " + "\'" + name
				+ "\'" + ");";
		transaction.addSql(sql);
		return true;
	}

	/**
	 * Actualiza la información de la comunidad en la base de datos construyendo
	 * el sql y pasandoselo a la transacción
	 * 
	 * @param transaction
	 *            La transacción que se está ejecutando
	 * @return booleano que indica si se pudo ejecutar la operación o no
	 */
	public boolean update( Transaction transaction )
	{
		if( id != 0 )
		{
			String sql = "UPDATE comunidad SET " + "empr_id=" + supplierId
					+ ", " + "comu_nombre=\'" + name + "\' " + "WHERE comu_id="
					+ id + ";";
			transaction.addSql(sql);
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Elimina la información de la comunidad de la base de datos construyendo
	 * el sql y pasandoselo a la transacción
	 * 
	 * @param transaction
	 *            La transacción que se está ejecutabdo
	 * @return booleano que indica si se pudo ejecutar la operación o no
	 */
	public boolean delete( Transaction transaction )
	{
		String sqlCommunityStore = "DELETE FROM comunidad_establecimiento WHERE comu_id="
				+ this.getId() + ";";
		String sqlScale = "DELETE FROM escala_precio_producto WHERE comu_id="
				+ this.getId() + ";";
		String sqlCommunity = "DELETE FROM comunidad WHERE comu_id="
				+ this.getId() + ";";

		String sqlStores = "SELECT esta_id FROM comunidad_establecimiento WHERE comu_id="
				+ this.getId() + ";";

		try
		{
			Vector result = SQLUtilities.query(sqlStores);
			if( result.size() > 0 )
			{
				int i = 0;
				while( i < result.size() )
				{
					Hashtable aux = (Hashtable) result.elementAt(i);
					int storeId = ((Integer) aux.get("esta_id")).intValue();
					this.removeStore(transaction, storeId);
					i++;
				}
			}
		}
		catch (QueryException qe)
		{
			//System.out.println("QueryError "+qe);
		}

		/*
		 * Eliminar las entradas en minorista_proveedor si el minorista no
		 * pertenece a otras comunidades del proveedor
		 */
		transaction.addSql(sqlCommunityStore);
		transaction.addSql(sqlScale);
		transaction.addSql(sqlCommunity);

		return true;
	}

	/**
	 * Este método permite adicionar un establecimiento a una comunidad
	 * 
	 * @param transaction
	 *            Transacción que se está ejecutando
	 * @param storeId
	 *            Identificador de establecimiento
	 * @return Valor booleano que indica si la opearción tuvo éxito o no
	 */
	public boolean addStore( Transaction t, int storeId )
	{
		boolean response = true;
		int communityStoreId = this.hashCode();
		Vector result = new Vector();
		Hashtable aux = new Hashtable();

		String sql = "INSERT INTO comunidad_establecimiento VALUES("
				+ communityStoreId + "," + storeId + "," + this.getId() + ");";
		t.addSql(sql);

		int billingId = this.hashCode();
		String sqlBilling = "INSERT INTO relacion_facturacion VALUES("
				+ billingId + "," + this.getId() + "," + storeId + ",\'"
				+ new Date(new java.util.Date().getTime()) + "\',\'\');";
		//System.out.println(sqlBilling);
		t.addSql(sqlBilling);

		return response;
	}

	/**
	 * Este método permite eliminar a un establecimiento de una comunidad
	 * 
	 * @param transaction
	 *            Transacción que se está ejecutando
	 * @param storeId
	 *            Identificador del establecimiento
	 * @return Valor booleano que indica si la opearción tuvo éxito o no
	 */
	public boolean removeStore( Transaction t, int storeId )
	{
		boolean response = true;
		int communityId = this.hashCode();
		String sql = "DELETE FROM comunidad_establecimiento "
				+ "WHERE comu_id=" + this.getId() + " AND " + "esta_id ="
				+ storeId + ";";
		t.addSql(sql);

		String sqlBilling = "SELECT rela_fact_id,rela_fact_fecha_desactivacion "
				+ "FROM relacion_facturacion "
				+ "WHERE rela_fact_comunidad="
				+ this.getId()
				+ " AND "
				+ "rela_fact_establecimiento="
				+ storeId + ";";

		try
		{
			String sqlUpdateBilling = new String(
					"UPDATE relacion_facturacion SET rela_fact_fecha_desactivacion =\'"
							+ new Date(new java.util.Date().getTime()) + "\' ");
			//System.out.println(sqlBilling);

			Vector result = SQLUtilities.query(sqlBilling);

			if( result.size() > 0 )
			{
				int billingId = 0;
				int i = 0;
				boolean keyExist = false;
				while( i < result.size() )
				{
					Hashtable aux = (Hashtable) result.elementAt(i);
					if( aux.get("rela_fact_fecha_desactivacion") == null )
					{
						billingId = ((Integer) aux.get("rela_fact_id"))
								.intValue();
						keyExist = true;
						break;
					}
					i++;
				}

				if( keyExist )
				{
					sqlUpdateBilling = sqlUpdateBilling
							.concat("WHERE rela_fact_id=" + billingId + ";");
					//System.out.println("SQL >> "+sqlUpdateBilling);
					t.addSql(sqlUpdateBilling);
				}
				else
				{
					response = false;
				}

			}
			else
			{
				response = false;
			}
		}
		catch (QueryException qe)
		{
			response = false;
		}
		return response;
	}

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

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

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

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

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

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

	public static int getComunityOfShopKeeper( int store, int supplier )
	{
		int comunity = 0;
		String sql = "SELECT comunidad.comu_id FROM comunidad, comunidad_establecimiento "
				+ "WHERE esta_id=" + store + " AND empr_id=" + supplier + ";";
		//        System.out.println( sql );
		try
		{
			Vector res = SQLUtilities.query(sql);
			Hashtable data = (Hashtable) res.elementAt(0);
			comunity = ((Integer) data.get("comu_id")).intValue();
		}
		catch (Exception e)
		{
			comunity = 0;
		}
		return comunity;
	}

}