package com.fenalco.entities;

import java.util.Hashtable;
import java.util.Random;
import java.util.Vector;

import com.fenalco.utilities.database.QueryException;
import com.fenalco.utilities.database.SQLUtilities;
import com.fenalco.utilities.mail.MailHandler;

/*
 * PasswordHandler.java
 *
 * Created on 11 de agosto de 2004, 11:52 AM
 */

/**
 * Esta clase es la encargada de administrar toda la funcionalidad respectiva a
 * la administración de las contraseñas que incluye verificación de contraseña,
 * consulta de contraseña de usuario, y envío de contraseña en caso de olvido
 * 
 * @author Mario Linares
 */
public class PasswordHandler
{

	/**
	 * Constructor por omisión de la clase PasswordHandler
	 */
	public PasswordHandler( )
	{
	}

	/**
	 * Este método estático permite verificar la validez de una contraseña
	 * asociada a un login específico. Para tal efecto debe consultar en la base
	 * de datos (tabla usuario)a través del método <CODE>query</CODE> de la
	 * clase <CODE>SQLUtilities</CODE> la constraseña del login pasado como
	 * parámetro y luego comparar el resultado con el parámetro password y
	 * retornar un booleano como resultado de esta comparación
	 * 
	 * @param login
	 *            String que contiene el login del usuario
	 * @param password
	 *            String que contiene el password del usuario a ser verificado
	 * @return boolean que representa la validez de la contraseña y/o login
	 */
	public static boolean verifyPassword( String login, String password )
	{
		boolean response = true;
		Vector result = new Vector();
		try
		{
			String sql = "SELECT usua_login, usua_contrasena FROM usuario "
					+ "WHERE usua_login = \'" + login
					+ "\' AND usua_contrasena = \'" + password + "\';";
			result = SQLUtilities.query(sql);
			//result vacío indica la no existencia de la dupla
			// (login,contrasena).
			if( result.isEmpty() )
			{
				response = false;
			}
		}
		catch (QueryException qe)
		{
			//System.out.println("Query Error: "+qe);
			response = false;
		}
		return response;
	}

	/**
	 * Este método estático retorna el password del usuario identificado con el
	 * login recibido como parámetro. Para tal efecto debe consultar en la base
	 * de datos (tabla usuario)a través del método <CODE>query</CODE> de la
	 * clase <CODE>SQLUtilities</CODE> la contraseña asociada con el login
	 * recibido como parámetro para luego retornarla como un String.
	 * 
	 * En el hipotético caso de no existir dicho usuario en el sistema el string
	 * de respuesta será ERROR.
	 * 
	 * @param login
	 *            String que contiene el login del usuario
	 * @return String que contiene el password consultado
	 */
	public static String getPassword( String login )
	{
		String passwordResponse;
		Vector result = new Vector();
		Hashtable userData = new Hashtable();
		try
		{
			String sql = "SELECT usua_contrasena FROM usuario "
					+ "WHERE usua_login = \'" + login + "\';";
			result = SQLUtilities.query(sql);

			if( result.isEmpty() )
			{
				passwordResponse = "ERROR";
			}
			else
			{
				userData = (Hashtable) result.elementAt(0);
				passwordResponse = (String) userData.get("usua_contrasena")
						.toString();
			}

		}
		catch (QueryException qe)
		{
			//System.out.println("Query Error: "+qe);
			passwordResponse = "ERROR";
		}
		return passwordResponse;
	}

	/**
	 * Esta función verifica que un nombre de usuario no exista en la base de
	 * datos
	 */
	public static boolean existLogin( String login )
	{
		boolean flag = false;
		try
		{

			String query = new String("SELECT empr_id" + " FROM usuario"
					+ " WHERE usua_login=\'" + login + "\';");
			Vector results = SQLUtilities.query(query);
			if( results.size() > 0 )
			{
				flag = true;
			}
		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
		}

		return flag;
	}

	/**
	 * Este método envía un mensaje de correo (email) a un usuario específicado
	 * por el parámetro login. Para tal efecto debe consultar en la tabla
	 * usuario de la base de datos los campos email, nombre, apellido y password
	 * a través del método <CODE>query</CODE> de la clase <CODE>SQLUtilities
	 * </CODE> y luego enviar el mensaje con el método estático <CODE>sendMail
	 * </CODE> de la clase <CODE>MailBuilder</CODE>
	 * 
	 * @param login
	 *            String que contiene el login del usuario
	 * @return boolean que representa el exito de la construcción y envío del
	 *         email
	 */
	public static boolean sendPassword( String login )
	{
		boolean response = true;
		Vector result = new Vector();
		Hashtable userData = new Hashtable();
		try
		{
			String sql = "SELECT usua_login,usua_contrasena,usua_nombre,usua_apellido,usua_email FROM usuario "
					+ "WHERE usua_login = \'" + login + "\';";
			result = SQLUtilities.query(sql);

			if( result.isEmpty() )
			{
				response = false;
			}
			else
			{
				userData = (Hashtable) result.elementAt(0);
				String userLogin = (String) (userData.get("usua_login"))
						.toString();
				String userPasswd = (String) (userData.get("usua_contrasena"))
						.toString();
				String userFirstName = (String) (userData.get("usua_nombre"))
						.toString();
				String userLastName = (String) (userData.get("usua_apellido"))
						.toString();
				String to = (String) (userData.get("usua_email")).toString();

				String from = "PVL<pvl@pvl.com.co>";
				String subject = "Recuperación de Contraseña.";
				String message = "Proceso de recuperación exitoso.\n"
						+ "Nombre del Usuario: "
						+ userFirstName
						+ " "
						+ userLastName
						+ ".\n"
						+ "Contraseña de Usuario: "
						+ userPasswd
						+ ".\n\n"
						+ "::Por motivos de seguridad recomendamos eliminar este mensaje una vez haya sido leído::\n"
						+ "::Gracias por utilizar PVL::";
				MailHandler mh = MailHandler.getInstance();
				if( !mh.sendMail(from, to, subject, message) )
				{
					response = false;
				}
			}
		}
		catch (QueryException qe)
		{
			//System.out.println("Query Error: "+qe);
			response = false;
		}
		return response;
	}

	/**
	 * Este mètodo genera una contraseña aleatoria de 8 caracteres
	 */
	public static String buildRandPasswd( )
	{
		StringBuffer passwd = new StringBuffer("");
		Random rand = new Random();
		char token;
		int a, b;

		for( int i = 0; i < 8; i++ )
		{
			double u = Math.random();
			if( u < 0.33 )
			{
				a = 9;
				b = 48;

			}
			else
				if( u < 0.66 )
				{
					a = 25;
					b = 65;
				}
				else
				{
					a = 25;
					b = 97;

				}
			token = (char) (rand.nextInt(a) + b);
			passwd.append(token);

		}
		return passwd.toString();
	}

	/*
	 * public static void main(String[] args){
	 * 
	 * System.out.println(PasswordHandler.existPassword("tt"));
	 *  }
	 */
}