/*
 * LogList.java
 *
 * Created on 21 de agosto de 2004, 16:00
 */

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;

/**
 * Esta clase representa el log de eventos del sisema, representado por las
 * entradas de la tabla log en la base de datos.
 * 
 * @author Néstor Romero León
 */
public class LogList
{

	/**
	 * Este Hashtable contiene el listado de las entradas del log, está
	 * conformado de la siguiente forma: - key: logId Identificador de la
	 * entrada del log - value: Objeto del tipo Log
	 */
	private Hashtable log;

	/**
	 * Constructor por omisión, crea una nueva instancia del objeto.
	 * 
	 * Llama al método loadData para cargar el log de eventos desde la base de
	 * datos.
	 */
	public LogList( )
	{
		this.log = new Hashtable();
		this.loadData();
	}

	/**
	 * Crea una instancia delobjeto de acuerdo a los parámetros que recibe.
	 * 
	 * Llama al método <CODE>loadData(param)</CODE> para cargar el log desde
	 * la base de datos.
	 * 
	 * Permitirá construir un listado de entradas del log de eventos filtrado
	 * por varias campos como el usuario, la operación o la fecha de realización
	 * de la operación.
	 * 
	 * @param userId
	 *            Identificador del usuario
	 * @param actionId
	 *            Identificador de la operación realizada;
	 * @param startDate
	 *            Fecha de inicio.
	 * @param endDate
	 *            Fecha de terminación
	 */
	public LogList( String userId, int actionId, Date startDate, Date endDate)
	{
		this.log = new Hashtable();
		this.loadData(userId, actionId, startDate, endDate);
	}

	/**
	 * Este método carga el log de eventos desde la base de datos por medio del
	 * método <CODE>query</CODE> de la clase <CODE>SQLUtilities</CODE>.
	 */
	public void loadData( )
	{
		Vector result = new Vector();
		Hashtable aux = new Hashtable();
		String sql = "SELECT log_id,log_fecha,log_hora " + "FROM log "
				+ "ORDER BY log_fecha DESC, log_hora DESC;";

		try
		{
			result = SQLUtilities.query(sql);
			for( int i = 0; i < result.size(); i++ )
			{
				aux = (Hashtable) result.elementAt(i);
				this.log.put((Integer) aux.get("log_id"), new Log(
						((Integer) aux.get("log_id")).intValue()));
			}
		}
		catch (QueryException qe)
		{
			//System.out.println("Query Error: "+qe);
		}
	};

	/**
	 * Este método carga el log de eventos desde la base de datos por medio del
	 * método <CODE>query</CODE> de la clase <CODE>SQLUtilities</CODE>.
	 * 
	 * Este método construye el listado con base a los parámetros usuario,
	 * acción y un rango de fechas.
	 * 
	 * Este método puede recibir como parámetro por omisión en los parámetros
	 * para el usuario("") y acción(-1) o 0000-00-00 para las fechas como
	 * valores que indican todos los valores de ese campo.
	 * 
	 * @param userId
	 *            Identificador del usuario
	 * @param actionId
	 *            Identificador de la operación realizada;
	 * @param startDate
	 *            Fecha de inicio.
	 * @param endDate
	 *            Fecha de terminación
	 */
	public void loadData( String userId, int actionId, Date startDate,
			Date endDate )
	{
		Vector result = new Vector();
		Hashtable aux = new Hashtable();
		String logUsuario = " AND usua_login=\'" + userId + "\' ";
		String logAccion = "AND accion.acci_id = " + actionId + " ";
		String logRangeDate = "AND log_fecha BETWEEN \'" + startDate
				+ "\' AND \'" + endDate + "\' ";

		String sql = new String("SELECT log_id,log_fecha,log_hora "
				+ "FROM log,accion " + "WHERE log.acci_id=accion.acci_id ");
		if( !userId.equals("") )
		{
			sql = sql.concat(logUsuario);
		}

		if( actionId > -1 )
		{
			sql = sql.concat(logAccion);
		}

		if( startDate.getTime() > 0 )
		{
			sql = sql.concat(logRangeDate);
		}

		sql = sql.concat("ORDER BY log_fecha DESC, log_hora DESC;");

		//        System.out.println(sql);
		try
		{
			result = SQLUtilities.query(sql);
			for( int i = 0; i < result.size(); i++ )
			{
				aux = (Hashtable) result.elementAt(i);
				this.log.put((Integer) aux.get("log_id"), new Log(
						((Integer) aux.get("log_id")).intValue()));
			}
		}
		catch (QueryException qe)
		{
			System.out.println("Query Error: " + qe);
		}
	};

	/**
	 * Consultor para el atributo log.
	 * 
	 * @return Valor del atributo log.
	 */
	public Hashtable getLog( )
	{
		return log;
	}

	/**
	 * Modificador para el atributo log.
	 * 
	 * @param log
	 *            Nuevo valor del atributo log.
	 */
	public void setLog( Hashtable log )
	{
		this.log = log;
	}

	public static void main( String[] args )
	{
		Date newDate = new Date(0);
		LogList ll = new LogList("", 2, newDate, newDate);
		System.out.println(ll.getLog().size());
	}
}