package com.fp.base.persistence.util.helper;

import com.fp.base.persistence.util.db.DataHelper;
import com.fp.common.helper.Constant;
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.acco.TgeneAccount;
import com.fp.persistence.pgeneral.acco.TgeneAccountKey;
import com.fp.persistence.pgeneral.acco.TgeneAccountStatus;
import com.fp.persistence.pgeneral.acco.TgeneAccountStatusKey;
import com.fp.persistence.pgeneral.gene.*;
import com.fp.persistence.pgeneral.installment.TgeneInstallmentType;
import com.fp.persistence.pgeneral.product.TgeneModule;
import com.fp.persistence.pgeneral.product.TgeneProduct;
import com.fp.persistence.pgeneral.product.TgeneSubProduct;
import com.fp.persistence.pgeneral.safe.TsafeUser;
import com.fp.persistence.pgeneral.trans.TgeneTransaction;
import com.fp.persistence.pgeneral.trans.TgeneTransactionItem;

/**
 * Clase utilitaria que entrega las descripciones generales, de productos, monedas, tipos de credito, adicionalmente
 * completa descripciones en tgeneaccount, tgenesolicitude.
 *
 * @author Jorge Vaca
 * @version 2.1
 */
public class GeneralDescriptions {

    /**
     * Metodo que completa descripciones de cuenta.
     *
     * @param pTgeneAccount Datos generales de la cuenta.
     * @throws Exception
     */
    public static void completeAccountDescriptions(TgeneAccount pTgeneAccount) throws Exception {
        pTgeneAccount.addAddtionalInfo("moduledesc", GeneralDescriptions.getModuledesc(pTgeneAccount.getModulecode()));
        pTgeneAccount.addAddtionalInfo("productdesc",
                GeneralDescriptions.getProductdesc(pTgeneAccount.getModulecode(), pTgeneAccount.getProductcode()));
        pTgeneAccount.addAddtionalInfo(
                "subproductdesc",
                GeneralDescriptions.getSubProductdesc(pTgeneAccount.getModulecode(), pTgeneAccount.getProductcode(),
                pTgeneAccount.getSubproductcode()));
        pTgeneAccount.addAddtionalInfo("currencydesc", GeneralDescriptions.getCurrencydesc(pTgeneAccount.getCurrencycode()));
        pTgeneAccount.addAddtionalInfo("statusdesc",
                GeneralDescriptions.getStatusdesc(pTgeneAccount.getModulecode(), pTgeneAccount.getAccountstatuscode()));
    }

    /**
     * Metodo que completa descripciones de uan solicitud.
     *
     * @param pTgeneSolicitude Datos generales de una solicitud.
     * @throws Exception
     */
    public static void completeSolicitudeDescriptions(TgeneSolicitude pTgeneSolicitude) throws Exception {
        pTgeneSolicitude.addAddtionalInfo("moduledesc", GeneralDescriptions.getModuledesc(pTgeneSolicitude.getModulecode()));
        pTgeneSolicitude.addAddtionalInfo("productdesc",
                GeneralDescriptions.getProductdesc(pTgeneSolicitude.getModulecode(), pTgeneSolicitude.getProductcode()));
        pTgeneSolicitude.addAddtionalInfo(
                "subproductdesc",
                GeneralDescriptions.getSubProductdesc(pTgeneSolicitude.getModulecode(), pTgeneSolicitude.getProductcode(),
                pTgeneSolicitude.getSubproductcode()));
        pTgeneSolicitude.addAddtionalInfo("currencydesc", GeneralDescriptions.getCurrencydesc(pTgeneSolicitude.getCurrencycode()));
    }

    /**
     * Metodo que entrega la descripcion del detalle de catalogo.
     *
     * @param pCatalog Codigo de tiposobregiro, base de calculo, destiono de fondos etc.
     * @param pCatalogcode Codigo de catalogo.
     * @return String.
     * @throws Exception
     */
    public static String getCatalogdetaildesc(String pCatalog, String pCatalogcode) throws Exception {
        TgeneCatalogDetail detail = com.fp.persistence.commondb.db.DataHelper.getInstance().getTgeneCatalogDetail(pCatalog, pCatalogcode);
        return detail.getDescription();
    }

    /**
     * Metodo que entrega la descripcion de tipo de credito.
     *
     * @param pCredittype Codigo de tipo de credito.
     * @return String.
     * @throws Exception
     */
    public static String getCredittypedesc(String pCredittype) throws Exception {
        if (pCredittype == null) {
            return "";
        }
        TgeneCreditType ctype = DataHelper.getInstance().getTgeneCreditType(pCredittype);
        return ctype.getDescription();
    }

    /**
     * Metodo que entrega la descripcion del tipo de tabla de amortizacion.
     *
     * @param pInstallmenttype Codigo de tipo de tabla de amortizacion.
     * @return String.
     * @throws Exception
     */
    public static String getInstallmettypedesc(String pInstallmenttype, String pModule) throws Exception {
        if (pInstallmenttype == null) {
            return "";
        }
        TgeneInstallmentType itype = DataHelper.getInstance().getTgeneInstallmentType(pInstallmenttype, pModule);
        return itype.getDescription();
    }

    /**
     * Metodo que entrega la descripcion de la frequencia.
     *
     * @param pFrequencycode Codigo de frequencia.
     * @return String.
     * @throws Exception
     */
    public static String getFrequencydesc(Integer pFrequencycode) throws Exception {
        if (pFrequencycode == null) {
            return "";
        }
        TgeneFrequency frequency = DataHelper.getInstance().getTgeneFrecuency(pFrequencycode);
        return frequency.getDescription();
    }

    /**
     * Metodo que entrega el nombre del oficial de cuenta.
     *
     * @param pUser Codigo de usuario.
     * @return String.
     * @throws Exception
     */
    public static String getOfficername(String pUser) throws Exception {
        if (pUser == null) {
            return "";
        }
        TsafeUser user = DataHelper.getInstance().getTsafeUser(pUser);
        return GeneralDescriptions.getPersonname(user.getPersoncode());
    }

    /**
     * Metodo que entrega el nombre del usuario.
     *
     * @param pUser Codigo de usuario.
     * @return String.
     * @throws Exception
     */
    public static String getUsername(String pUser) throws Exception {
        if (pUser == null) {
            return "";
        }
        TsafeUser user = DataHelper.getInstance().getTsafeUser(pUser);
        return GeneralDescriptions.getPersonname(user.getPersoncode());
    }

    /**
     * Metodo que entrega el email de un usuario.s
     *
     * @param pUser Codigo de usuario.
     * @return String.
     * @throws Exception
     */
    public static String getEmailByUser(String pUser) throws Exception {
        if (pUser == null) {
            return "";
        }
        TsafeUser user = DataHelper.getInstance().getTsafeUser(pUser);
        return GeneralDescriptions.getEmail(user.getPersoncode());
    }

    /**
     * Metodo que entrega el email de una persona
     *
     * @param pPersoncode Codigo de persona a obtener el email.
     * @return String.
     * @throws Exception
     */
    public static String getEmail(Integer pPersoncode) throws Exception {
        return TcustPersonAddress.getEmail(PersistenceHelper.getEntityManager(), pPersoncode);
    }

    /**
     * Metodo que entrega el nombre de una persona.
     *
     * @param pPersoncode Codigo de persona a obtener el nombre.
     * @return String.
     * @throws Exception
     */
    public static String getPersonname(Integer pPersoncode) throws Exception {
        return TcustPersonDetail.find(PersistenceHelper.getEntityManager(), pPersoncode).getName();
    }

    /**
     * Metodo que entrega la descripcion de la moneda.
     *
     * @param pBranch Codigo de sucursal.
     * @param company Compania a la que pertenece la sucursal
     * @return String.
     * @throws Exception
     */
    public static String getBranchdesc(Integer pBranch, Integer company) throws Exception {
        return TgeneBranch.find(PersistenceHelper.getEntityManager(), pBranch, company).getDescription();
    }

    /**
     * Metodo que entrega la descripcion de la Etiqueta.
     *
     * @param pBranch Codigo de sucursal.
     * @param company Compania a la que pertenece la sucursal
     * @return String.
     * @throws Exception
     */
    public static String getLabel(String pLabel, String pLanguagecode, String pChannelcode) throws Exception {
        TgeneLabelKey k = new TgeneLabelKey(pLabel, pLanguagecode, pChannelcode);
        TgeneLabel label = TgeneLabel.find(PersistenceHelper.getEntityManager(), k);
        if (label == null) {
            return pLabel;
        }
        return label.getDescription();
    }

    /**
     * Metodo que entrega la descripcion de la moneda.
     *
     * @param pOffice Codigo de oficina.
     * @param pBranch Codigo de sucursal.
     * @param pCompany Codigo de compania.
     * @return String.
     * @throws Exception
     */
    public static String getOfficedesc(Integer pOffice, Integer pBranch, Integer pCompany) throws Exception {
        TgeneOfficeKey tgeneOfficeKey = new TgeneOfficeKey(pOffice, pBranch, pCompany);
        TgeneOffice office = TgeneOffice.find(PersistenceHelper.getEntityManager(), tgeneOfficeKey);
        return office.getDescription();
    }

    /**
     * Metodo que entrega la descripcion de la moneda.
     *
     * @param pCurrency Codigo de moneda.
     * @return String.
     * @throws Exception
     */
    public static String getCurrencydesc(String pCurrency) throws Exception {
        TgeneCurrency currency = DataHelper.getInstance().getTgeneCurrency(pCurrency);
        return currency.getDescription();
    }

    /**
     * Metodo que entrega la descripcion del status de la cuenta.
     *
     * @param pModule Codigo de modulo.
     * @param pStatus Codigo de status.
     * @return String
     * @throws Exception
     */
    public static String getStatusdesc(String pModule, String pStatus) throws Exception {
        TgeneAccountStatusKey key = new TgeneAccountStatusKey(pModule, pStatus);
        TgeneAccountStatus status = TgeneAccountStatus.find(PersistenceHelper.getEntityManager(), key);
        return status.getDescription();
    }

    /**
     * Metodo que entrega la descripcion del modulo.
     *
     * @param pModule Codigo de modulo.
     * @return String.
     * @throws Exception
     */
    public static String getModuledesc(String pModule) throws Exception {
        return TgeneModule.find(PersistenceHelper.getEntityManager(), pModule).getDescription();
    }

    /**
     * Metodo que entrega la descripcion del producto.
     *
     * @param pModule Codigo de modulo.
     * @param pProduct Codigo de producto.
     * @return String
     * @throws Exception
     */
    public static String getProductdesc(String pModule, String pProduct) throws Exception {
        if (pProduct == null) {
            return "";
        }
        return TgeneProduct.find(PersistenceHelper.getEntityManager(), pModule, pProduct).getDescription();
    }

    /**
     * Metodo que entrega la descripcion del subproducto.
     *
     * @param pModule Codigo de modulo.
     * @param pProduct Codigo de producto.
     * @param pSubProduct Codigo de subproducto.
     * @return String
     * @throws Exception
     */
    public static String getSubProductdesc(String pModule, String pProduct, String pSubProduct) throws Exception {
        if (pSubProduct == null) {
            return "";
        }
        return TgeneSubProduct.find(PersistenceHelper.getEntityManager(), pModule, pProduct, pSubProduct).getDescription();
    }

    /**
     * Metodo que devuelve el nombre o descripcion de la tranbsaccion
     *
     * @param transactionmodule Codigo modulo
     * @param transactioncode Codigo transaccion
     * @param transactionversion Codigo version
     * @return
     * @throws Exception
     */
    public static String getTransactiondesc(String transactionmodule, Integer transactioncode, Integer transactionversion) throws Exception {
        TgeneTransaction tgeneTransaction = com.fp.persistence.commondb.db.DataHelper.getInstance().getTgeneTransaction(transactionmodule,
                transactioncode, transactionversion);
        if (tgeneTransaction == null) {
            return "TRANSACCION NO DEFINIDA";
        }
        return tgeneTransaction.getName();
    }

    /**
     * Metodo que devuelve la descripcion del rubro de una transaccion
     *
     * @param transactionmodule Modulo de la transaccion
     * @param transactioncode Codigo de la transaccion
     * @param transactionversion Version de la transaccion
     * @param itemcode Rubro de la transaccion
     * @return
     * @throws Exception
     */
    public static String getTransactionItemdesc(String transactionmodule, Integer transactioncode, Integer transactionversion, Integer itemcode)
            throws Exception {
        TgeneTransactionItem tgeneTransactionItem = DataHelper.getInstance().getTgeneTransactionItem(transactionmodule, transactioncode,
                transactionversion, itemcode);
        return tgeneTransactionItem.getDescription();
    }

    /**
     * Metodo que devuelve el nombre de una cuenta
     *
     * @param account Numero de cuenta
     * @param company Compania ala que pertenece la cuenta
     * @return
     * @throws Exception
     */
    public static String getAccountName(String account, Integer company) throws Exception {
        TgeneAccountKey key = new TgeneAccountKey(account, company, Constant.getDefaultExpiryTimestamp());
        return TgeneAccount.find(PersistenceHelper.getEntityManager(), key).getAccountname();
    }
}
