package com.fp.person.rules.query.code;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;

import com.fp.common.helper.Constant;
import com.fp.dto.query.QueryRequest;
import com.fp.dto.rules.QueryRule;
import com.fp.general.exception.GeneralException;
import com.fp.persistence.commondb.PersistenceHelper;

/**
 * Clase que verifica si las direcciones se encuentran referenciadas en las tablas de TcustPeopleJob y
 * TcustCompanyBranch
 * 
 * @author JARIAS
 * 
 */
public class ValidationAddress extends QueryRule {

    /**
	 * 
	 */
    private static final long serialVersionUID = 1L;

    /**
     * Metodo que consulta los datos de manera normal segun el query enviado
     */
    @Override
    public QueryRequest process(QueryRequest qr) throws Exception {
        // TODO Auto-generated method stub
        List<Object> result = null;
        List<Object> resultBranch = null;
        Integer personcode = null;
        Object objpersoncode = qr.get("personcode");
        if (objpersoncode instanceof String) {
            personcode = Integer.parseInt(objpersoncode.toString());
        } else if (objpersoncode instanceof String) {
            personcode = (Integer) objpersoncode;
        }

        Integer addressnumber = (Integer) qr.get("addressnumber");
        result = this.ValidateAddressJob(personcode, addressnumber);
        resultBranch = this.ValidateAddressBranch(personcode, addressnumber);
        if (((result != null) && (!result.isEmpty())) || ((resultBranch != null) && (!resultBranch.isEmpty()))) {
            throw new GeneralException("CUST-0010", "NO SE PUEDE ELIMINAR LA DIRECCIÓN PORQUE SE ENCUENTRA ASOCIADA");
        }
        return qr;

    }

    /**
     * Metodo que consulta si la direccion esta refernciada en la tabla TcustPeopleJob
     * 
     * @param personcode codigo de la persona dueña de la direccion
     * @param addressnumber codigo de la direccion a consultar
     * @return numberAddress retorna el codigo de la direccion si esta refenciado si es igual a 0 no existe referencia
     */
    private List<Object> ValidateAddressJob(Integer personcode, Integer addressnumber) throws Exception {
        List<Object> numberAddress = new ArrayList<Object>();
        Query qry = PersistenceHelper.getEntityManager().createQuery(ValidationAddress.JPQLJOB);
        qry.setParameter("personcode", personcode);
        qry.setParameter("dateto", Constant.getDefaultExpiryTimestamp());
        qry.setParameter("addressnumber", addressnumber);
        return numberAddress = qry.getResultList();

    }

    /**
     * Metodo que consulta si la direccion se encuentra referenciado en la tabla TcustCompanyBranch
     * 
     * @param personcode codigo de la persona dueña de la direccion
     * @param addressnumber codigo de la direccion a consultar
     * @return numberAddress la lista es diferente de null si existe referencia
     * @throws Exception
     */
    private List<Object> ValidateAddressBranch(Integer personcode, Integer addressnumber) throws Exception {
        List<Object> addressBranch = new ArrayList<Object>();
        Query qry = PersistenceHelper.getEntityManager().createQuery(ValidationAddress.JPQLBRANCH);
        qry.setParameter("personcode", personcode);
        qry.setParameter("dateto", Constant.getDefaultExpiryTimestamp());
        qry.setParameter("addressnumber", addressnumber);
        return addressBranch = qry.getResultList();

    }

    /**
     * Sentecia para consulta en la TcustPeopleJob
     */
    private static final String JPQLJOB = "select t.address from TcustPeopleJob t where t.pk.personcode=:personcode"
            + "  and t.pk.dateto=:dateto and t.address=:addressnumber";

    /**
     * Sentencia para consultar en la TcustCompanyBranch
     */
    private static final String JPQLBRANCH = "select t.addressnumber from TcustCompanyBranch t where t.pk.personcode=:personcode "
            + "  and t.pk.dateto=:dateto and t.addressnumber=:addressnumber";

}
