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;
import com.fenalco.utilities.mail.MailHandler;

/**
 * Representa un reclamo
 * 
 * @aunthor Andrés Romero Rodríguez
 */
public class Complaint
{
	/**
	 * Identificador del reclamo
	 */
	private int id;

	/**
	 * Identificador de la categoria a la cual pertenece el reclamo
	 */
	private int categoryId;

	/**
	 * Nombre de lca categoria a la cual pertenece el reclamo
	 */
	private String categoryName;

	/**
	 * Dirección de correo electrónico a donde se va a dirigir el reclamo
	 */
	private String destinationEmail;

	/**
	 * Fecha en la que se hace el reclamo
	 */
	private Date date;

	/**
	 * Identificador del usuario que hace el reclamo (login)
	 */
	private String userId;

	/**
	 * Nombre del usuario que hace el reclamo
	 */
	private String userName;

	/**
	 * El contenido del reclamo
	 */
	private String content;

	/**
	 * Constructor por omisión, crea un reclamo vacio
	 */
	public Complaint( )
	{
		// do nothing
	}

	/**
	 * Constructor que recibe el identificador del reclamo y llama al método
	 * loadData para que cargue la información del reclamo de la base de datos
	 * 
	 * @param id
	 *            Identificador del reclamo
	 */
	public Complaint( int id)
	{
		loadData(id);
	}

	/**
	 * Carga la información del reclamo de la base de datos a partir del
	 * identificador
	 * 
	 * @param id
	 *            Identificador del reclamo para buscarlo en la base de datos
	 * @return booleano que indica si se pudo cargar la información o no
	 */
	public boolean loadData( int id )
	{
		boolean respuesta = false;
		this.id = id;
		String sql = "SELECT usua_login, cate_recl_id, recl_contenido, recl_fecha "
				+ "FROM reclamo WHERE recl_id=" + id + ";";

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

			categoryId = ((Integer) datos.get("cate_recl_id")).intValue();
			date = (Date) datos.get("recl_fecha");
			userId = (String) datos.get("usua_login");
			content = (String) datos.get("recl_contenido");

			// para obtener el nombre de la categoria y el correo al que va
			// dirigida
			sql = "SELECT cate_recl_nombre, cate_recl_email FROM categoria_reclamo "
					+ "WHERE cate_recl_id=" + categoryId + ";";
			res = SQLUtilities.query(sql);
			datos = (Hashtable) res.elementAt(0);

			categoryName = (String) datos.get("cate_recl_nombre");
			destinationEmail = (String) datos.get("cate_recl_email");

			// para obtener el nombre del usuario
			sql = "SELECT usua_nombre, usua_apellido FROM usuario WHERE "
					+ "usua_login=\'" + userId + "\';";
			res = SQLUtilities.query(sql);
			datos = (Hashtable) res.elementAt(0);

			userName = (String) datos.get("usua_nombre") + " "
					+ (String) datos.get("usua_apellido");

			respuesta = true;
		}
		catch (QueryException ex)
		{
			System.out.println("en la mala --> " + ex);
			respuesta = false;
		}
		catch (Exception e)
		{
			respuesta = false;
		}
		return respuesta;
	}

	/**
	 * Almacena la información del reclamo en la base de datos creando el sql y
	 * adicionandolo a la transacción con el método <CODE>addSql</CODE>
	 * 
	 * @return booleano que indica si se pudo almancenar la información o no
	 * @param transaction
	 *            Transacción que se está ejecutando
	 */
	public boolean saveData( Transaction transaction )
	{
		id = this.hashCode();
		String sql = "INSERT INTO reclamo (recl_id, usua_login, cate_recl_id, "
				+ "recl_contenido, recl_fecha) VALUES(" + id + ", \'" + userId
				+ "\', " + categoryId + ", \'" + content + "\', \'" + date
				+ "\');";

		transaction.addSql(sql);
		return true;
	}

	/**
	 * Actualiza la información del un reclamo en la base de datos creando el
	 * sql y adicionandolo a la transacción con el método <CODE>addSql</CODE>
	 * 
	 * @return booleano que indica si se pudo actualizar la información o no
	 * @param transaction
	 *            Transacción que se está ejecutando
	 */
	public boolean update( Transaction transaction )
	{
		boolean res = false;
		if( id != 0 )
		{
			String sql = "UPDATE reclamo SET" + " usua_login=\'" + userId
					+ "\'" + ", cate_recl_id=" + categoryId
					+ ", recl_contenido=\'" + content + "\'"
					+ ", recl_fecha=\'" + date + "\'" + " WHERE recl_id=" + id
					+ ";";

			transaction.addSql(sql);
		}
		else
		{
			res = false;
		}
		return res;
	}

	/**
	 * Elimina la información del un reclamo en la base de datos creando el sql
	 * y adicionandolo a la transacción con el método <CODE>addSql</CODE>
	 * 
	 * @param transaction
	 *            La transacción actual
	 * @return Booleano que indica si se pudo eliminar o no el registro
	 */
	public boolean delete( Transaction transaction )
	{
		boolean res = false;
		if( id != 0 )
		{
			String sql = "DELETE FROM reclamo WHERE recl_id=" + id + ";";
			transaction.addSql(sql);
			res = true;
		}
		else
		{
			res = false;
		}
		return res;
	}

	/**
	 * registra el nuevo reclamo que se ha generado, para ello hace lo
	 * siguiente: 1. llama al método saveData para almacenar el reclamo en la
	 * base de datos 2. llama al método submit para enviar el correo a quien
	 * corresponda
	 * 
	 * @return booleano que indica si se pudo registrar el reclamo o no
	 * @param transaction
	 *            Transacción que se está ejecutando
	 */
	public boolean submitComplaint( Transaction transaction )
	{
		boolean flag = true;
		this.saveData(transaction);
		flag = transaction.execute();
		if( flag )
		{
			flag = submit();
		}
		return flag;
	}

	/**
	 * Envia el correo con el reclamo a la dirección respectiva
	 * 
	 * @return booleano que indica si se pudo enviar el correo con el reclamo o
	 *         no
	 */
	public boolean submit( )
	{
		//TODO: enviar el correo con la plantilla que mario haga...
		String template = "Mensaje de queja enviado...\n";
		MailHandler mh = MailHandler.getInstance();
		return (mh.sendMail("pvl@pvl.com.co", this.getDestinationEmail(),
				"Mensaje de " + this.getUserName(), template
						+ this.getContent()));

	}

	/**
	 * Getter para el atributo id.
	 * 
	 * @return valor del atributo id.
	 */
	public int getId( )
	{
		return id;
	}

	/**
	 * Setter para el atributo id.
	 * 
	 * @param id
	 *            nuevo valor del atributo id.
	 */
	public void setId( int id )
	{
		this.id = id;
	}

	/**
	 * Getter para el atributo categoryId.
	 * 
	 * @return valor del atributo categoryId.
	 */
	public int getCategoryId( )
	{
		return categoryId;
	}

	/**
	 * Setter para el atributo categoryId.
	 * 
	 * @param categoryId
	 *            nuevo valor del atributo categoryId.
	 */
	public void setCategoryId( int categoryId )
	{
		this.categoryId = categoryId;
	}

	/**
	 * Getter para el atributo categoryName.
	 * 
	 * @return valor del atributo categoryName.
	 */
	public java.lang.String getCategoryName( )
	{
		return categoryName;
	}

	/**
	 * Setter para el atributo categoryName.
	 * 
	 * @param categoryName
	 *            nuevo valor del atributo categoryName.
	 */
	public void setCategoryName( java.lang.String categoryName )
	{
		this.categoryName = categoryName;
	}

	/**
	 * Getter para el atributo destinationEmail.
	 * 
	 * @return valor del atributo destinationEmail.
	 */
	public java.lang.String getDestinationEmail( )
	{
		return destinationEmail;
	}

	/**
	 * Setter para el atributo destinationEmail.
	 * 
	 * @param destinationEmail
	 *            nuevo valor del atributo destinationEmail.
	 */
	public void setDestinationEmail( java.lang.String destinationEmail )
	{
		this.destinationEmail = destinationEmail;
	}

	/**
	 * Getter para el atributo date.
	 * 
	 * @return valor del atributo date.
	 */
	public java.sql.Date getDate( )
	{
		return date;
	}

	/**
	 * Setter para el atributo date.
	 * 
	 * @param date
	 *            nuevo valor del atributo date.
	 */
	public void setDate( java.sql.Date date )
	{
		this.date = date;
	}

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

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

	/**
	 * Getter para el atributo userName.
	 * 
	 * @return valor del atributo userName.
	 */
	public java.lang.String getUserName( )
	{
		return userName;
	}

	/**
	 * Setter para el atributo userName.
	 * 
	 * @param userName
	 *            nuevo valor del atributo userName.
	 */
	public void setUserName( java.lang.String userName )
	{
		this.userName = userName;
	}

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

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

}