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;

/**
 * @author
 * 
 * Esta clase representa a un usuario del sistema, esta información se usará
 * para el inicio de sesión.
 */
public class User
{
	/**
	 * nombre de usuario para el inicio de sesión
	 */
	private String login;

	/**
	 * la contraseña para el inicio de sesión (encriptada)
	 */
	private String password;

	/**
	 * codigo de acceso para iniciar sesión desde un dispositivo nurit ( aunque
	 * este atributo es de tipo string va a almacenar un dato numérico)
	 */
	private String nuritLogin = "";

	/**
	 * contraseña para iniciar sesión desde un dispositivo nurit ( aunque este
	 * atributo es de tipo string va a almacenar un dato numérico)
	 */
	private String nuritPassword = "";

	/**
	 * nombre del usuario
	 */
	private String firstName;

	/**
	 * Apellido del usuario
	 */
	private String lastName;

	/**
	 * Identificador del cargo del usuario
	 */
	private int positionId;

	/**
	 * Cargo del usuario dentro de la empresa a la cual representa
	 */
	private String positionName;

	/**
	 * Correo electrónico del usuario
	 */
	private String email;

	/**
	 * Número de identificación del usuario (idealmente es la cédula)
	 */
	private String identificationNumber;

	/**
	 * String que representa al identificador de la compañía a la cual pertenece
	 * el usuario
	 */
	private int companyId;

	/**
	 * Nombre de la empresa a la que pertenece el usuario
	 */
	private String companyName;

	/**
	 * Identificador del rol que juega el usuario dentro del sistema
	 */
	private int roleId;

	/**
	 * Nombre del rol que juega el usuario dentro del sisitema
	 */
	private String roleName;

	/**
	 * Número telefónico del usuario
	 */
	private String phoneNumber;

	/**
	 * Constructor por defecto de la clse
	 */
	public User( )
	{

	}

	/**
	 * Constructor que recibe el nombre de usuario y carga los datos de la base
	 * de datos llamando al método loadData
	 * 
	 * @param login
	 *            el nombre de usuario
	 */
	public User( String login)
	{
		loadData(login);
	}

	/**
	 * carga los datos del usuario de la base de datos dado el nombre de usuario
	 * y retorna un booleano que indica si se pudieron cargar los datos o no
	 * 
	 * @param login
	 *            el nombre de usuario
	 * 
	 * @return booleano que indica si se pudo cargar los datos o no
	 */
	public boolean loadData( String login )
	{
		boolean flag = false;
		this.login = login;

		String sql = "SELECT rol_id, empr_id, usua_contrasena, usua_login_nurit, "
				+ "usua_contrasena_nurit, usua_nombre, usua_apellido, cargo.carg_id, cargo.carg_nombre, "
				+ "usua_email, usua_cedula, usua_telefono FROM usuario,cargo "
				+ "WHERE usua_login=\'"
				+ login
				+ "\' AND usuario.carg_id=cargo.carg_id;";

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

			password = (String) datos.get("usua_contrasena");
			nuritLogin = (String) datos.get("usua_login_nurit");
			nuritPassword = (String) datos.get("usua_contrasena_nurit");
			firstName = (String) datos.get("usua_nombre");
			lastName = (String) datos.get("usua_apellido");
			positionId = ((Integer) datos.get("carg_id")).intValue();
			positionName = (String) datos.get("carg_nombre");
			email = (String) datos.get("usua_email");
			identificationNumber = (String) datos.get("usua_cedula");

			Integer auxId = (Integer) datos.get("empr_id");
			int compId = 0;
			if( auxId != null )
			{
				compId = auxId.intValue();
			}
			companyId = compId;

			roleId = ((Integer) datos.get("rol_id")).intValue();
			phoneNumber = (String) datos.get("usua_telefono");
			identificationNumber = (String) datos.get("usua_cedula");

			// para obtener el nombre de la empresa
			sql = "SELECT empr_nombre_comercial FROM empresa WHERE empr_id="
					+ companyId + ";";
			res = SQLUtilities.query(sql);
			datos = (Hashtable) res.elementAt(0);

			companyName = (String) datos.get("empr_nombre_comercial");

			// para obtener el nombre del rol
			sql = "SELECT rol_nombre FROM rol WHERE rol_id=" + roleId + ";";
			res = SQLUtilities.query(sql);
			datos = (Hashtable) res.elementAt(0);

			roleName = (String) datos.get("rol_nombre");

			flag = true;
		}
		catch (QueryException ex)
		{
			System.out.println("Error cargando datos de usuario --> " + ex);
			flag = false;
		}catch (Exception e){
                    System.out.println("El usuario " + login + " no existe");
                    flag = false;
                }

		return flag;
	}

	/**
	 * almacena la información del usuario en la base de datos usando el método
	 * <CODE>addSql</CODE> de la transacción
	 * 
	 * @return booleano que indica si se pudieron guardar los datos o no
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean saveData( Transaction transaction )
	{
		String sql = "INSERT INTO usuario (" + "usua_login, " + "rol_id, "
				+ "empr_id, " + "usua_contrasena, " + "usua_login_nurit, "
				+ "usua_contrasena_nurit, " + "usua_nombre, "
				+ "usua_apellido, " + "carg_id, " + "usua_email, "
				+ "usua_cedula, " + "usua_telefono" + ") VALUES(" + "\'"
				+ login + "\', " + roleId + ", " + companyId + ", " + "\'"
				+ password + "\', " + "\'" + nuritLogin + "\', " + "\'"
				+ nuritPassword + "\', " + "\'" + firstName + "\', " + "\'"
				+ lastName + "\', " + positionId + ", " + "\'" + email + "\', "
				+ "\'" + identificationNumber + "\', " + "\'" + phoneNumber
				+ "\'" + ");";
		transaction.addSql(sql);
		return true;
	}

	/**
	 * actualiza la información del usaurio en la base de datos usando el método
	 * <CODE>addSql</CODE> de la transacción
	 * 
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean update( Transaction transaction )
	{
		String sql = "";

		sql = "UPDATE usuario SET " + "rol_id=" + roleId + ", " + "empr_id="
				+ companyId + ", " + "usua_contrasena=\'" + password + "\', "
				+ "usua_login_nurit=\'" + nuritLogin + "\', "
				+ "usua_contrasena_nurit=\'" + nuritPassword + "\', "
				+ "usua_nombre=\'" + firstName + "\', " + "usua_apellido=\'"
				+ lastName + "\', " + "carg_id=" + positionId + ", "
				+ "usua_email=\'" + email + "\', " + "usua_cedula=\'"
				+ identificationNumber + "\', " + "usua_telefono=\'"
				+ phoneNumber + "\' " + "WHERE usua_login=\'" + login + "\';";

		transaction.addSql(sql);
		return true;
	}

	/**
	 * Elimina a un usuario de la base de datos usando el método <CODE>addSql
	 * </CODE> de la transacción
	 * 
	 * @return un booleano que indica si se pudo eliminar al usuario o no
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean delete( Transaction transaction )
	{
		// primero tengo que borrar los registros donde se referencie esta tabla
		// - reclamo
		// - log

		try
		{
			// reclamo
			String sql = "SELECT recl_id FROM reclamo WHERE usua_login=\'"
					+ login + "\';";
			Vector res = SQLUtilities.query(sql);
			for( int i = 0; i < res.size(); i++ )
			{
				Hashtable datos = (Hashtable) res.elementAt(i);
				Complaint c = new Complaint();
				c.setId(((Integer) datos.get("recl_id")).intValue());
				c.delete(transaction);
			}

			sql = "DELETE FROM usuario WHERE usua_login=\'" + login + "\';";
			transaction.addSql(sql);
			return true;
		}
		catch (Exception e)
		{
			return false;
		}
	}

	/**
	 * Getter para el atributo login.
	 * 
	 * @return Valor del atributo login.
	 */
	public String getLogin( )
	{
		return login;
	}

	/**
	 * Setter para el atributo login.
	 * 
	 * @param login
	 *            Nuevo Valor del atributo login.
	 */
	public void setLogin( String login )
	{
		this.login = login;
	}

	/**
	 * Getter for property password.
	 * 
	 * @return Value of property password.
	 */
	public String getPassword( )
	{
		return password;
	}

	/**
	 * Setter para el atributo password.
	 * 
	 * @param password
	 *            Nuevo Valor del atributo password.
	 */
	public void setPassword( String password )
	{
		this.password = password;
	}

	/**
	 * Getter para el atributo nuritLogin.
	 * 
	 * @return Valor del atributo nuritLogin.
	 */
	public String getNuritLogin( )
	{
		return nuritLogin;
	}

	/**
	 * Setter para el atributo nuritLogin.
	 * 
	 * @param nuritLogin
	 *            Nuevo Valor del atributo nuritLogin.
	 */
	public void setNuritLogin( String nuritLogin )
	{
		this.nuritLogin = nuritLogin;
	}

	/**
	 * Getter para el atributo nuritPassword.
	 * 
	 * @return Valor del atributo nuritPassword.
	 */
	public String getNuritPassword( )
	{
		return nuritPassword;
	}

	/**
	 * Setter para el atributo nuritPassword.
	 * 
	 * @param nuritPassword
	 *            Nuevo Valor del atributo nuritPassword.
	 */
	public void setNuritPassword( String nuritPassword )
	{
		this.nuritPassword = nuritPassword;
	}

	/**
	 * Getter para el atributo firstName.
	 * 
	 * @return Valor del atributo firstName.
	 */
	public String getFirstName( )
	{
		return firstName;
	}

	/**
	 * Setter para el atributo firstName.
	 * 
	 * @param firstName
	 *            Nuevo Valor del atributo firstName.
	 */
	public void setFirstName( String firstName )
	{
		this.firstName = firstName;
	}

	/**
	 * Getter para el atributo lastName.
	 * 
	 * @return Valor del atributo lastName.
	 */
	public String getLastName( )
	{
		return lastName;
	}

	/**
	 * Setter para el atributo lastName.
	 * 
	 * @param lastName
	 *            Nuevo Valor del atributo lastName.
	 */
	public void setLastName( String lastName )
	{
		this.lastName = lastName;
	}

	/**
	 * Getter para el atributo position.
	 * 
	 * @return Valor del atributo position.
	 */

	/**
	 * Getter para el atributo email.
	 * 
	 * @return Valor del atributo email.
	 */
	public String getEmail( )
	{
		return email;
	}

	/**
	 * Setter para el atributo email.
	 * 
	 * @param email
	 *            Nuevo Valor del atributo email.
	 */
	public void setEmail( String email )
	{
		this.email = email;
	}

	/**
	 * Getter para el atributo identificationNumber.
	 * 
	 * @return Valor del atributo identificationNumber.
	 */
	public String getIdentificationNumber( )
	{
		return identificationNumber;
	}

	/**
	 * Setter para el atributo identificationNumber.
	 * 
	 * @param identificationNumber
	 *            Nuevo Valor del atributo identificationNumber.
	 */
	public void setIdentificationNumber( String identificationNumber )
	{
		this.identificationNumber = identificationNumber;
	}

	/**
	 * Getter para el atributo companyName.
	 * 
	 * @return Valor del atributo companyName.
	 */
	public String getCompanyName( )
	{
		return companyName;
	}

	/**
	 * Setter para el atributo companyName.
	 * 
	 * @param companyName
	 *            Nuevo Valor del atributo companyName.
	 */
	public void setCompanyName( String companyName )
	{
		this.companyName = companyName;
	}

	/**
	 * Getter para el atributo roleId.
	 * 
	 * @return Valor del atributo roleId.
	 */
	public int getRoleId( )
	{
		return roleId;
	}

	/**
	 * Setter para el atributo roleId.
	 * 
	 * @param roleId
	 *            Nuevo Valor del atributo roleId.
	 */
	public void setRoleId( int roleId )
	{
		this.roleId = roleId;
	}

	/**
	 * Getter para el atributo roleName.
	 * 
	 * @return Valor del atributo roleName.
	 */
	public String getRoleName( )
	{
		return roleName;
	}

	/**
	 * Setter para el atributo roleName.
	 * 
	 * @param roleName
	 *            Nuevo Valor del atributo roleName.
	 */
	public void setRoleName( String roleName )
	{
		this.roleName = roleName;
	}

	/**
	 * Getter para el atributo phoneNumber
	 * 
	 * @return Returns the phoneNumber.
	 */
	public String getPhoneNumber( )
	{
		return phoneNumber;
	}

	/**
	 * Setter para el atributo phoneNumber
	 * 
	 * @param phoneNumber
	 *            The phoneNumber to set.
	 */
	public void setPhoneNumber( String phoneNumber )
	{
		this.phoneNumber = phoneNumber;
	}

	/**
	 * 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;
	}

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

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

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

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

}