package com.fp.person.db;

import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pgeneral.gene.TgeneCanton;
import com.fp.persistence.pgeneral.gene.TgeneCantonKey;
import com.fp.persistence.pgeneral.gene.TgeneCity;
import com.fp.persistence.pgeneral.gene.TgeneCityKey;
import com.fp.persistence.pgeneral.gene.TgeneCountry;
import com.fp.persistence.pgeneral.gene.TgeneParroquia;
import com.fp.persistence.pgeneral.gene.TgeneParroquiaKey;
import com.fp.persistence.pgeneral.gene.TgeneProvince;
import com.fp.persistence.pgeneral.gene.TgeneProvinceKey;

/**
 * Clase utilitaria que maneje sql y hql utiliada en el proyecto person. 
 * @author Jorge Vaca
 * @version 2.1
 */
public class DataHelper {

    /**Almacena una instancia de DataHelper.*/
    private static DataHelper cache;

    /**
     * Entrega una instancia de DataHelper.
     * @return	DataHelper
     */
    public static DataHelper getInstance() {
        if (cache != null) {
            return cache;
        }
        synchronized (DataHelper.class) {
            if (cache == null) {
                cache = new DataHelper();
            }
        }
        return cache;
    }

    /**
     * Metodo que entrega datos de una sucursal definidos en TgeneBranch.
     * @param pBranch	Codigo de sucursal.
     * @param pCompany	Compania a la que pertenece la cuenta.
     * @return	TgeneBranch
     * @throws Exception
     */
    public TcustPersonDetail getTcustPersonDetail(Integer pPersonCode) throws Exception {
    	return TcustPersonDetail.find(PersistenceHelper.getEntityManager(), pPersonCode);
    }
    
    

    /**
     * Metodo que entrega datos de una Direccion definida en TcustPersonAddress.
     * @param personcode Codigo de la persona a quien pertenece la Direccion.
     * @param addressnumber Numero de la direccion.
     * @return tcustPersonAddress
     * @throws Exception
     */
    public TcustPersonAddress getTcustPersonAddress(Integer personcode, Integer addressnumber) throws Exception {
        return TcustPersonAddress.findByPersonCode(PersistenceHelper.getEntityManager(), personcode, addressnumber);
    }
    
    
    
    /**
     * Metodo que entrega datos de un Pais definido en TgeneCountry.
     * @param countrycode Codigo que identfica el Pais.
     * @return tgeneCountry
     * @throws Exception
     */
    public TgeneCountry getTgeneCountry(String countrycode) throws Exception {
        TgeneCountry tgeneCountry = null;
        tgeneCountry = (TgeneCountry) PersistenceHelper.getSession().get(TgeneCountry.class, countrycode);
        return tgeneCountry;
    }
    
    
    
    /**
     * Metodo que entrega datos de una Provincia definida en TgeneProvince.
     * @param countrycode Codigo del pais al cual pertenece la Provincia.
     * @param provincecode Codigo que identfica la Provincia.
     * @return tgeneProvince
     * @throws Exception
     */
    public TgeneProvince getTgeneProvince(String countrycode, String provincecode) throws Exception {
        TgeneProvinceKey tgeneProvinceKey = new TgeneProvinceKey(countrycode, provincecode);
        TgeneProvince tgeneProvince = null;
        tgeneProvince = (TgeneProvince) PersistenceHelper.getSession().get(TgeneProvince.class, tgeneProvinceKey);
        return tgeneProvince;
    }
    
    
    
    /**
     * Metodo que devuelve un objeto de tipo TgeneCanton
     * @param countrycode Codigo de pais
     * @param provincecode Codigo provincia
     * @param cantoncode Codigo canton
     * @return
     * @throws Exception
     */
    public TgeneCanton getTgeneCanton(String countrycode, String provincecode, String cantoncode) throws Exception {
        TgeneCantonKey tgeneCantonKey = new TgeneCantonKey(countrycode, provincecode, cantoncode);
        TgeneCanton tgeneCanton = null;
        tgeneCanton = (TgeneCanton) PersistenceHelper.getSession().get(TgeneCanton.class, tgeneCantonKey);
        return tgeneCanton;
    }
    
    
    
    /**
     * Metodo que entrega datos de una Ciudad definida en TgeneCity.
     * @param countrycode Codigo del pais al cual perteneces la Ciudad.
     * @param provincecode Codigo de la provincia al cual pertenece la Ciudad.
     * @param cantoncode Codigo del canton de la ciudad
     * @param citycode Codigo que identfica la Ciudad.
     * @return tgeneCity
     * @throws Exception
     */
    public TgeneCity getTgeneCity(String countrycode, String provincecode, String cantoncode, String citycode) throws Exception {
        TgeneCityKey tgeneCityKey = new TgeneCityKey(countrycode, provincecode, cantoncode, citycode);
        TgeneCity tgeneCity = null;
        tgeneCity = (TgeneCity) PersistenceHelper.getSession().get(TgeneCity.class, tgeneCityKey);
        return tgeneCity;
    }
    
    
    
    /**
     * Metodo que entrega datos de una Parroquia definida en TgeneParroquia.
     * @param countrycode Codigo del pais al cual perteneces la Ciudad.
     * @param provincecode Codigo de la provincia al cual pertenece la Ciudad.
     * @param cantoncode Codigo del canton de la ciudad
     * @param parroquiacode Codigo que identfica a la parroquia.
     * @return tgeneCity
     * @throws Exception
     */
    public TgeneParroquia getTgeneParroquia(String countrycode, String provincecode, String cantoncode, String parroquiacode) throws Exception {
        TgeneParroquiaKey tgeneParroquiaKey = new TgeneParroquiaKey(countrycode, provincecode, cantoncode, parroquiacode);
        TgeneParroquia tgeneParroquia = null;
        tgeneParroquia = (TgeneParroquia) PersistenceHelper.getSession().get(TgeneParroquia.class, tgeneParroquiaKey);
        return tgeneParroquia;
    }
    
}
