/*
 * Log.java
 *
 * Created on 21 de agosto de 2004, 14:28
 */

package com.fenalco.entities;

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

/**
 * Esta clase representa una entrada en la tabla log, permite el registro de
 * actividades en el sistema.
 * 
 * @author Néstor Romero León
 */
public class Log
{
	/**
	 * Identificador de la entrada de la tabla log
	 */
	private int logId;

	/**
	 * Identificador del usuario
	 */
	private String userId;

	/**
	 * Identificador de la operación realizada
	 */
	private int actionId;

	/**
	 * Número de cédula del usuario registrado
	 */
	private String identificationNumber;

	/**
	 * Nombre de la operación realizada
	 */
	private String actionName;

	/**
	 * Fecha en la que se realizó la operación
	 */
	private Date logDate;

	/**
	 * Hora a la que se realizó la operación
	 */
	private Time logTime;

	/**
	 * Descripción de la operación realizada.
	 */
	private String logDescription;

	/**
	 * Descripción del usuario "suplantado" (en caso de que el usurio logueado
	 * tenga el rol callcenter).
	 */
	private String externalUser;

	/**
	 * Constructor por omisión. Crea una instancia del objeto.
	 */
	public Log( )
	{
	};

	/**
	 * Crea una instancia del objeto por medio de un identificador en la tabla
	 * log.
	 * 
	 * Carga todos los datos de la entrada en los atributos de la clase,
	 * llamando al método <CODE>loadData</CODE>.
	 * 
	 * @param logId
	 *            Identificador de la entrada en el log.
	 */
	public Log( int logId)
	{
		this.loadData(logId);
	}

	/**
	 * Este método carga los datos de la entrada del log en el objeto, por medio
	 * de un llamado al método <CODE>query</CODE> de la clase <CODE>
	 * SQLUtilities</CODE>.
	 * 
	 * @param logId
	 *            Identificador de la entrada en el log.
	 */
	public void loadData( int logId )
	{
		Vector result = new Vector();
		Hashtable aux = new Hashtable();
		String sql = "SELECT log_login_usuario, log_cedula_usuario, accion.acci_id,acci_nombre,log_fecha,log_hora,log_descripcion,log_usuario_externo "
				+ "FROM log,accion "
				+ "WHERE log.acci_id = accion.acci_id AND "
				+ "log.log_id = "
				+ logId + " " + "ORDER BY log_fecha DESC,log_hora DESC;";
		this.logId = logId;

		try
		{
			result = SQLUtilities.query(sql);
			aux = (Hashtable) result.elementAt(0);
			this.userId = ((String) aux.get("log_login_usuario")).toString();
			this.identificationNumber = ((String) aux.get("log_cedula_usuario"))
					.toString();
			this.actionId = ((Integer) aux.get("acci_id")).intValue();
			this.actionName = ((String) aux.get("acci_nombre")).toString();
			String newDate = ((Date) aux.get("log_fecha")).toString();
			String newTime = aux.get("log_hora").toString();
			this.logDate = Date.valueOf(newDate);
			this.logTime = Time.valueOf(newTime);
			this.logDescription = ((String) aux.get("log_descripcion"))
					.toString();
			this.externalUser = ((String) aux.get("log_usuario_externo"))
					.toString();

		}
		catch (QueryException qe)
		{
			System.out.println("QueryEror: " + qe);
		}
	};

	/**
	 * Método estático que permite registrar una nueva entrada en el log de
	 * eventos.
	 * 
	 * @param userId
	 *            Usuario que realiza la operación
	 * @param actionId
	 *            Operación realizada por el usaurio.
	 * @param description
	 *            Descripción de la operación realizada por el usuario.
	 * @return Valor booleano que indica si la operación tuvo éxito o no.
	 */
	public boolean saveData( String userId, String numberId, int actionId,
			String description, String externalUser, Transaction transaction )
	{
		Date date = new Date((new java.util.Date()).getTime());
		Time time = new Time((new java.util.Date()).getTime());
		int logId;
		boolean response = true;

		logId = this.hashCode() + description.hashCode();

		String sql = "INSERT INTO log " + "VALUES (" + logId + "," + actionId
				+ ",\'" + userId + "\',\'" + numberId + "\',\'"
				+ date.toString() + "\',\'" + time.toString() + "\',\'"
				+ description + "\',\'" + externalUser + "\');";
		transaction.addSql(sql);

		return response;
	}

        
        public int hashCode(){
           //int hashCode = ((new Time((new java.util.Date()).getTime())).toString() + userId).hashCode();
           int hashCode = new Long(new java.util.Date().getTime()).intValue();
           return hashCode;
        }
        
	/**
	 * Consultor para el atributo logId.
	 * 
	 * @return Valor del atributo logId.
	 */
	public int getLogId( )
	{
		return logId;
	}

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

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

	/**
	 * Modificador para el atributo userId.
	 * 
	 * @param userId
	 *            Nuevo valor del atributo userId.
	 */
	public void setUserId( String userId )
	{
		this.userId = userId;
	}

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

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

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

	/**
	 * Modificador para el atributo actionName.
	 * 
	 * @param actionName
	 *            Nuevo valor del atributo actionName.
	 */
	public void setActionName( String actionName )
	{
		this.actionName = actionName;
	}

	/**
	 * Consultor para el atributo logDate.
	 * 
	 * @return Valor del atributo logDate.
	 */
	public Date getLogDate( )
	{
		return logDate;
	}

	/**
	 * Modificador para el atributo logDate.
	 * 
	 * @param logDate
	 *            Nuevo valor del atributo logDate.
	 */
	public void setLogDate( Date logDate )
	{
		this.logDate = logDate;
	}

	/**
	 * Consultor para el atributo logTime.
	 * 
	 * @return Valor del atributo logTime.
	 */
	public Time getLogTime( )
	{
		return logTime;
	}

	/**
	 * Modificador para el atributo logTime.
	 * 
	 * @param logTime
	 *            Nuevo valor del atributo logTime.
	 */
	public void setLogTime( Time logTime )
	{
		this.logTime = logTime;
	}

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

	/**
	 * Modificador para el atributo logDescription.
	 * 
	 * @param logDescription
	 *            Nuevo valor del atributo logDescription.
	 */
	public void setLogDescription( String logDescription )
	{
		this.logDescription = logDescription;
	}

	public static void main( String[] args )
	{
	}

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

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

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

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

}