package com.fp.persistence.pgeneral.safe;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.Version;

import com.fp.common.helper.Constant;
import com.fp.dto.hb.HibernateBean;
import com.fp.dto.hb.Log;
import com.fp.general.exception.GeneralException;

/**
 * Clase que implementa la entidad de Hibernate que hace referencia a la tabla
 * TSAFEUSERDETAIL
 */
@Entity(name = "TsafeUserDetail")
@Table(name = "TSAFEUSERDETAIL")
public class TsafeUserDetail extends com.fp.dto.AbstractDataTransport implements
		Serializable, HibernateBean, Cloneable, Log {
	/**
	 * HashCode asociado con la Instancia
	 */
	@Transient
	private int hashValue = 0;
	/**
	 * Version de la Clase
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * Clave primaria de la Entidad TsafeUserDetail
	 */
	@EmbeddedId
	private TsafeUserDetailKey pk;
	
	@Version
	@Column(name = "RECORDVERSION", nullable = true)
	/**
	 * Optimistic blocking del registro
	 */
	private Integer recordversion;

	@Column(name = "DATEFROM", nullable = false)
	/**
	 * Fecha desde la cual esta vigente el registro del detalle de usuarios
	 */
	private Timestamp datefrom;

	@Column(name = "USERSTATUSCATALOG", nullable = true)
	/**
	 * Codigo de catalogo  ACT, Activo, BLQ Bloqueado,  RET Retirado
	 */
	private String userstatuscatalog;

	@Column(name = "USERSTATUSCATALOGCODE", nullable = true)
	/**
	 * Codigo de tabla de catalogo USERSTATUS del estatus del usuario
	 */
	private String userstatuscatalogcode;

	@Column(name = "COMPANYCODE", nullable = true)
	/**
	 * Codigo de compania a la que pertenece el departamento
	 */
	private Integer companycode;

	@Column(name = "AREACODE", nullable = true)
	/**
	 * Codigo de area
	 */
	private Integer areacode;

	@Column(name = "OFFICECODE", nullable = true)
	/**
	 * Codigo de oficina
	 */
	private Integer officecode;

	@Column(name = "BRANCHCODE", nullable = true)
	/**
	 * Codigo de sucursal
	 */
	private Integer branchcode;

	@Column(name = "CHANNELCODE", nullable = true)
	/**
	 * Codigo de canal.
	 */
	private String channelcode;

	@Column(name = "LANGUAGECODE", nullable = true)
	/**
	 * Codigo de idioma
	 */
	private String languagecode;

	@Column(name = "NICKNAME", nullable = false)
	/**
	 * Nombre corto o nombre común del usuario.
	 */
	private String nickname;

	@Column(name = "PASSWORD", nullable = true)
	/**
	 * Password
	 */
	private String password;

	@Column(name = "BRANCHFROMTERMINAL", nullable = true)
	/**
	 * Y indica que la sucursal, oficina area toma del terminal de la maquina
	 */
	private String branchfromterminal;

	@Column(name = "CHANGEPASSWORD", nullable = true)
	/**
	 * Y Indica que el usuario tiene que cambiar de password al momento de logon, cuando el administrador resea el password
	 */
	private String changepassword;

	@Column(name = "INGRESSUSER", nullable = true)
	/**
	 * Codigo de usuario que ingreso la informacion
	 */
	private String ingressuser;

	@Column(name = "MODIFYUSER", nullable = true)
	/**
	 * Codigo de usuario que modifico la informacion
	 */
	private String modifyuser;

	@Column(name = "ACTIVATEUSER", nullable = true)
	/**
	 * Codigo de usuario que pone operativo o activa al usuario.
	 */
	private String activateuser;

	@Column(name = "TERMINALCODE", nullable = true)
	/**
	 * null
	 */
	private String terminalcode;

	@Column(name = "ISUSERBPM", nullable = true)
	/**
	 * Y indica que el usuario esta habilitado para trabajar en el JBPM
	 */
	private String isuserbpm;
	
	@Column(name="CCENTROCONTROL", nullable=true)

	/**
	* Codigo de centro de control de armas
	*/
	private String ccentrocontrol;

	/** Contructor por defecto */
	public TsafeUserDetail() {
	}

	/**
	 * Contructor de TsafeUserDetail
	 * 
	 * @param pPk
	 *            Clave Primaria del entity
	 * @param pDatefrom
	 *            Fecha desde la cual esta vigente el registro del detalle de
	 *            usuarios
	 * @param pNickname
	 *            Nombre corto o nombre común del usuario.
	 */
	public TsafeUserDetail(TsafeUserDetailKey pPk, Timestamp pDatefrom,
			String pNickname) {
		this();
		pk = pPk;
		datefrom = pDatefrom;
		nickname = pNickname;
	}

	/**
	 * Metodo que entrega datos de la tabla dada la clave primaria.
	 * 
	 * @param pEntityManager
	 *            referencia de la session a obtener datos del bean.
	 * @param pKey
	 *            Caleve primaria del bean.
	 * @return TsafeUserDetail
	 */
	public static TsafeUserDetail find(EntityManager pEntityManager,
			TsafeUserDetailKey pKey) throws Exception {
		TsafeUserDetail obj = pEntityManager.find(TsafeUserDetail.class, pKey);
		return obj;
	}

	/**
	 * Entrega la Clave primaria de TsafeUserDetail
	 * 
	 * @return El objeto que referencia a la Clave primaria de TsafeUserDetail
	 */
	public TsafeUserDetailKey getPk() {
		return pk;
	}

	/**
	 * Fija un nuevo valor a la Clave primaria de TsafeUserDetail
	 * 
	 * @param pPk
	 *            El objeto que referencia a la nueva Clave primaria de
	 *            TsafeUserDetail
	 */
	public void setPk(TsafeUserDetailKey pPk) {
		pk = pPk;
	}

	/**
	 * Obtiene el valor de recordversion
	 * 
	 * @return valor de recordversion
	 */
	public Integer getRecordversion() {
		return recordversion;
	}

	/**
	 * Fija el valor de recordversion
	 * 
	 * @param pRecordversion
	 *            nuevo Valor de recordversion
	 */
	public void setRecordversion(Integer pRecordversion) {
		recordversion = pRecordversion;
	}

	/**
	 * Obtiene el valor de datefrom
	 * 
	 * @return valor de datefrom
	 */
	public Timestamp getDatefrom() {
		return datefrom;
	}

	/**
	 * Fija el valor de datefrom
	 * 
	 * @param pDatefrom
	 *            nuevo Valor de datefrom
	 */
	public void setDatefrom(Timestamp pDatefrom) {
		datefrom = pDatefrom;
	}

	/**
	 * Obtiene el valor de userstatuscatalog
	 * 
	 * @return valor de userstatuscatalog
	 */
	public String getUserstatuscatalog() {
		return userstatuscatalog;
	}

	/**
	 * Fija el valor de userstatuscatalog
	 * 
	 * @param pUserstatuscatalog
	 *            nuevo Valor de userstatuscatalog
	 */
	public void setUserstatuscatalog(String pUserstatuscatalog) {
		userstatuscatalog = pUserstatuscatalog;
	}

	/**
	 * Obtiene el valor de userstatuscatalogcode
	 * 
	 * @return valor de userstatuscatalogcode
	 */
	public String getUserstatuscatalogcode() {
		return userstatuscatalogcode;
	}

	/**
	 * Fija el valor de userstatuscatalogcode
	 * 
	 * @param pUserstatuscatalogcode
	 *            nuevo Valor de userstatuscatalogcode
	 */
	public void setUserstatuscatalogcode(String pUserstatuscatalogcode) {
		userstatuscatalogcode = pUserstatuscatalogcode;
	}

	/**
	 * Obtiene el valor de companycode
	 * 
	 * @return valor de companycode
	 */
	public Integer getCompanycode() {
		return companycode;
	}

	/**
	 * Fija el valor de companycode
	 * 
	 * @param pCompanycode
	 *            nuevo Valor de companycode
	 */
	public void setCompanycode(Integer pCompanycode) {
		companycode = pCompanycode;
	}

	/**
	 * Obtiene el valor de areacode
	 * 
	 * @return valor de areacode
	 */
	public Integer getAreacode() {
		return areacode;
	}

	/**
	 * Fija el valor de areacode
	 * 
	 * @param pAreacode
	 *            nuevo Valor de areacode
	 */
	public void setAreacode(Integer pAreacode) {
		areacode = pAreacode;
	}

	/**
	 * Obtiene el valor de officecode
	 * 
	 * @return valor de officecode
	 */
	public Integer getOfficecode() {
		return officecode;
	}

	/**
	 * Fija el valor de officecode
	 * 
	 * @param pOfficecode
	 *            nuevo Valor de officecode
	 */
	public void setOfficecode(Integer pOfficecode) {
		officecode = pOfficecode;
	}

	/**
	 * Obtiene el valor de branchcode
	 * 
	 * @return valor de branchcode
	 */
	public Integer getBranchcode() {
		return branchcode;
	}

	/**
	 * Fija el valor de branchcode
	 * 
	 * @param pBranchcode
	 *            nuevo Valor de branchcode
	 */
	public void setBranchcode(Integer pBranchcode) {
		branchcode = pBranchcode;
	}

	/**
	 * Obtiene el valor de channelcode
	 * 
	 * @return valor de channelcode
	 */
	public String getChannelcode() {
		return channelcode;
	}

	/**
	 * Fija el valor de channelcode
	 * 
	 * @param pChannelcode
	 *            nuevo Valor de channelcode
	 */
	public void setChannelcode(String pChannelcode) {
		channelcode = pChannelcode;
	}

	/**
	 * Obtiene el valor de languagecode
	 * 
	 * @return valor de languagecode
	 */
	public String getLanguagecode() {
		return languagecode;
	}

	/**
	 * Fija el valor de languagecode
	 * 
	 * @param pLanguagecode
	 *            nuevo Valor de languagecode
	 */
	public void setLanguagecode(String pLanguagecode) {
		languagecode = pLanguagecode;
	}

	/**
	 * Obtiene el valor de nickname
	 * 
	 * @return valor de nickname
	 */
	public String getNickname() {
		return nickname;
	}

	/**
	 * Fija el valor de nickname
	 * 
	 * @param pNickname
	 *            nuevo Valor de nickname
	 */
	public void setNickname(String pNickname) {
		nickname = pNickname;
	}

	/**
	 * Obtiene el valor de password
	 * 
	 * @return valor de password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * Fija el valor de password
	 * 
	 * @param pPassword
	 *            nuevo Valor de password
	 */
	public void setPassword(String pPassword) {
		password = pPassword;
	}

	/**
	 * Obtiene el valor de branchfromterminal
	 * 
	 * @return valor de branchfromterminal
	 */
	public String getBranchfromterminal() {
		return branchfromterminal;
	}

	/**
	 * Fija el valor de branchfromterminal
	 * 
	 * @param pBranchfromterminal
	 *            nuevo Valor de branchfromterminal
	 */
	public void setBranchfromterminal(String pBranchfromterminal) {
		branchfromterminal = pBranchfromterminal;
	}

	/**
	 * Obtiene el valor de changepassword
	 * 
	 * @return valor de changepassword
	 */
	public String getChangepassword() {
		return changepassword;
	}

	/**
	 * Fija el valor de changepassword
	 * 
	 * @param pChangepassword
	 *            nuevo Valor de changepassword
	 */
	public void setChangepassword(String pChangepassword) {
		changepassword = pChangepassword;
	}

	/**
	 * Obtiene el valor de ingressuser
	 * 
	 * @return valor de ingressuser
	 */
	public String getIngressuser() {
		return ingressuser;
	}

	/**
	 * Fija el valor de ingressuser
	 * 
	 * @param pIngressuser
	 *            nuevo Valor de ingressuser
	 */
	public void setIngressuser(String pIngressuser) {
		ingressuser = pIngressuser;
	}

	/**
	 * Obtiene el valor de modifyuser
	 * 
	 * @return valor de modifyuser
	 */
	public String getModifyuser() {
		return modifyuser;
	}

	/**
	 * Fija el valor de modifyuser
	 * 
	 * @param pModifyuser
	 *            nuevo Valor de modifyuser
	 */
	public void setModifyuser(String pModifyuser) {
		modifyuser = pModifyuser;
	}

	/**
	 * Obtiene el valor de activateuser
	 * 
	 * @return valor de activateuser
	 */
	public String getActivateuser() {
		return activateuser;
	}

	/**
	 * Fija el valor de activateuser
	 * 
	 * @param pActivateuser
	 *            nuevo Valor de activateuser
	 */
	public void setActivateuser(String pActivateuser) {
		activateuser = pActivateuser;
	}

	/**
	 * Obtiene el valor de terminalcode
	 * 
	 * @return valor de terminalcode
	 */
	public String getTerminalcode() {
		return terminalcode;
	}

	/**
	 * Fija el valor de terminalcode
	 * 
	 * @param pTerminalcode
	 *            nuevo Valor de terminalcode
	 */
	public void setTerminalcode(String pTerminalcode) {
		terminalcode = pTerminalcode;
	}

	/**
	 * Obtiene el valor de isuserbpm
	 * 
	 * @return valor de isuserbpm
	 */
	public String getIsuserbpm() {
		return isuserbpm;
	}

	/**
	 * Fija el valor de isuserbpm
	 * 
	 * @param pIsuserbpm
	 *            nuevo Valor de isuserbpm
	 */
	public void setIsuserbpm(String pIsuserbpm) {
		isuserbpm = pIsuserbpm;
	}
	
	/**Obtiene el valor de ccentrocontrol
	@return valor de ccentrocontrol*/
	public String getCcentrocontrol(){
	  return ccentrocontrol;
	}
	/**Fija el valor de ccentrocontrol
	@param pCcentrocontrol nuevo Valor de ccentrocontrol*/
	public void setCcentrocontrol(String pCcentrocontrol){
	  ccentrocontrol=pCcentrocontrol;
	}

	public boolean equals(Object rhs) {
		if (rhs == null)
			return false;
		if (!(rhs instanceof TsafeUserDetail))
			return false;
		TsafeUserDetail that = (TsafeUserDetail) rhs;
		if (this.getPk() == null || that.getPk() == null)
			return false;
		return (this.getPk().equals(that.getPk()));
	}

	/**
	 * Implementación del metodo hashCode de la la entidad TsafeUserDetail
	 * 
	 * @return el hashCode la instancia
	 */
	public int hashCode() {
		if (this.hashValue == 0) {
			int result = 17;
			if (this.getPk() == null) {
				result = super.hashCode();
			} else {
				result = this.getPk().hashCode();
			}
			this.hashValue = result;
		}
		return this.hashValue;
	}

	/** Implementación toString */
	public String toString() {
		Field[] fs = this.getClass().getDeclaredFields();
		String data = "";
		for (Field f : fs) {
			try {
				String name = f.getName();
				if (f.getType().getName().compareTo("java.util.Set") == 0)
					continue;
				if (name.compareTo("hashValue") == 0
						|| name.compareTo("serialVersionUID") == 0)
					continue;
				data += name + "=" + f.get(this) + ";";
			} catch (Exception e) {
				continue;
			}
		}
		if (data.compareTo("") == 0) {
			data = super.toString();
		}
		return data;
	}

	/** Implementación de la creación de un bean en blanco TsafeUserDetail */
	public Object createInstance() {
		TsafeUserDetail instance = new TsafeUserDetail();
		instance.setPk(new TsafeUserDetailKey());
		return instance;
	}

	/**
	 * Clona la entidad TsafeUserDetail
	 * 
	 * @see com.fp.dto.hb.HibernateBean#cloneMe()
	 */
	public Object cloneMe() throws CloneNotSupportedException {
		TsafeUserDetail p = (TsafeUserDetail) this.clone();
		p.setPk((TsafeUserDetailKey) this.pk.cloneMe());
		return p;
	}

	public Object getId() {
		return this.pk;
	}
	
    //METODOS MANUALES
    /**Sentecnia que entrega lista de los ultimos n passwords del usuario ordenados en forma decendente*/
    private static String SQL = "from TsafeUserDetail t where t.pk.usercode = :usercode "
            + " order by t.pk.dateto desc ";

    /**
     * Enterga una lista de registros asociados a un usuario de TsafeUserDetail ordenados en forma decendenete.
     * @param pEntityManager  Session de la base de datos.
     * @param pUserCode  Codigo de usuario
     * @param pNumReg  Numero de registros a obtener en la lista .
     * @return  List<TsafeUserDetail>
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public static List<TsafeUserDetail> find(EntityManager pEntityManager, String pUserCode, Integer pNumReg) throws Exception {
        List<TsafeUserDetail> ldata = null;
        Query qry = pEntityManager.createQuery(SQL);
        qry.setParameter("usercode", pUserCode);
        qry.setMaxResults(pNumReg);
        ldata = qry.getResultList();
        return ldata;
    }
    
    /**Sentecnia que entrega un objeto con los datos de un usuario.*/
    private static String JPQL_BY_USER = "from TsafeUserDetail t where t.pk.usercode = :usercode "
            + " and t.pk.dateto = :dateto ";
    
    /**
     * Enterga un objeto con los datos de un usuario de TsafeUserDetail.
     * @param pEntityManager  Session de la base de datos.
     * @param pUserCode  Codigo de usuario
     * @return  TsafeUserDetail
     * @throws Exception
     */
    public static TsafeUserDetail find(EntityManager pEntityManager, String pUserCode) throws Exception {
        TsafeUserDetail obj = null;
        Query qry = pEntityManager.createQuery(JPQL_BY_USER);
        qry.setParameter("usercode", pUserCode);
        qry.setParameter("dateto",Constant.getDefaultExpiryDate());
        try {
        	obj = (TsafeUserDetail)qry.getSingleResult();	
		} catch (NoResultException e) {
			throw new GeneralException("GENE-0035", "USUARIO: {0} NO DEFINIDO EN TSAFEUSERDETAIL", pUserCode);			
		}
        return obj;
    }
    
    
    /**
     * Sentencia que devuelve un registro de TgeneSubProduct.
     */
    private static final String JPQL_NAME_USER = "from TsafeUserDetail tsu  " + " where tsu.pk.usercode = :usercode "
            + " and tsu.pk.dateto = :dateto ";
    /**
     * Metodo que obtiene datos de un registro del subproducto.
     * 
     * @param pEntityManager  Session de la base de datos.
     * @param pModulecode Codigo de modulo a obtener datos de la base.
     * @param pProductcode Codigo de producto a obtener datos de la base.
     * @param pSubproductcode Codigo de subproducto a obtener datos de la base.
     * @return TgeneSubProduct
     * @throws Exception
     */
    public static TsafeUserDetail findByUserCode(EntityManager pEntityManager, String usercode) throws Exception {
        Query qry = pEntityManager.createQuery(TsafeUserDetail.JPQL_NAME_USER);
        qry.setParameter("usercode", usercode);
        qry.setParameter("dateto", Constant.getDefaultExpiryDate());
        try {
			return (TsafeUserDetail) qry.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
    }
    
}
