using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using GenesisCnx = LLNet.Tienda.wsGenesis;
using System.Xml;
using LLNet.GUI;
using LLNet.Utils;

namespace LLNet.Tienda.MainForms.Forms.CreditEko
{
    public class Credie
    {
        #region mSec_CrediEk
        private string mSec_CrediEk()
        {
            string vSeccrdx = "";
            Utils.QueryParams vQp = new LLNet.Utils.QueryParams();
            vSeccrdx = Convert.ToString(GUI.CApp.bll.GetSingleValue("SEC_CREDCONSEK", vQp, "PDV"));
            return vSeccrdx;
        }
        #endregion

        #region mRegistroBDCONSULTA
        private void mRegistroBDCONSULTA(string pERR_COD_ESTADO, string pERR_DESC, string pCOD_ESTADO,
            string pDESC_ESTADO, string pPER_CEDULA, string pPER_NOMBRE, string pPER_SALDO_DISP,
            string pPER_SALDO_POST, string pPER_CUOTA_TMP, string pREFERENCIA, string pMONTO)
        {
            Utils.QueryParams vQp = new LLNet.Utils.QueryParams();

            if (pERR_COD_ESTADO == "")
            {
                vQp.AddReplaceParam("pERR_COD_ESTADO", DBNull.Value.ToString());
            }
            else
            {
                vQp.AddReplaceParam("pERR_COD_ESTADO", pERR_COD_ESTADO);
            }
            if (pERR_DESC == "")
            {
                vQp.AddReplaceParam("pERR_DESC", DBNull.Value.ToString());
            }
            else
            {
                vQp.AddReplaceParam("pERR_DESC", pERR_DESC);
            }
            if (pCOD_ESTADO == "")
            {
                vQp.AddReplaceParam("pCOD_ESTADO", DBNull.Value.ToString());
            }
            else
            {
                vQp.AddReplaceParam("pCOD_ESTADO", pCOD_ESTADO);
            }
            if (pDESC_ESTADO == "")
            {
                vQp.AddReplaceParam("pDESC_ESTADO", DBNull.Value.ToString());
            }
            else
            {
                vQp.AddReplaceParam("pDESC_ESTADO", pDESC_ESTADO);
            }
            if (pPER_CEDULA == "")
            {
                vQp.AddReplaceParam("pPER_CEDULA", DBNull.Value.ToString());
            }
            else
            {
                vQp.AddReplaceParam("pPER_CEDULA", pPER_CEDULA);
            }
            if (pPER_NOMBRE == "")
            {
                vQp.AddReplaceParam("pPER_NOMBRE", DBNull.Value.ToString());
            }
            else
            {
                vQp.AddReplaceParam("pPER_NOMBRE", pPER_NOMBRE);
            }
            if (pPER_SALDO_DISP == "")
            {
                vQp.AddReplaceParam("pPER_SALDO_DISP", "0");
            }
            else
            {
                vQp.AddReplaceParam("pPER_SALDO_DISP", pPER_SALDO_DISP);
            }
            if (pPER_SALDO_POST == "")
            {
                vQp.AddReplaceParam("pPER_SALDO_POST", "0");
            }
            else
            {
                vQp.AddReplaceParam("pPER_SALDO_POST", pPER_SALDO_POST);
            }
            if (pPER_CUOTA_TMP == "")
            {
                vQp.AddReplaceParam("pPER_CUOTA_TMP", "0");
            }
            else
            {
                vQp.AddReplaceParam("pPER_CUOTA_TMP", pPER_CUOTA_TMP);
            }
            if (pREFERENCIA == "")
            {
                vQp.AddReplaceParam("pREFERENCIA", "0");
            }
            else
            {
                vQp.AddReplaceParam("pREFERENCIA", pREFERENCIA);
            }
            if (pMONTO == "")
            {
                vQp.AddReplaceParam("pMONTO", "0");
            }
            else
            {
                vQp.AddReplaceParam("pMONTO", pMONTO);
            }
            //Jornada
            vQp.AddReplaceParam("pJORNADA", Program.Jornada.ToString());


            // Llama el procedimiento que almacena los datos dl pago en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_CREDITOEK_ICONS", vQp, "PDV");
        }
        #endregion

        #region mRegistroBDERRORCONSULTA
        //Registrar en BD un error la consulta de un crédito
        private void mRegistroBDERRORCONSULTA(string pREFERENCIA, string pCEDULA, string pMONTO, string pERROR)
        {
            if (pERROR.Length > 255)
                pERROR = pERROR.Substring(0, 254);


            Utils.QueryParams vQp = new LLNet.Utils.QueryParams();

            if (pCEDULA == "")
            {
                vQp.AddReplaceParam("pCEDULA", DBNull.Value.ToString().ToString());
            }
            else
            {
                vQp.AddReplaceParam("pCEDULA", pCEDULA);
            }
            if (pMONTO == "")
            {
                vQp.AddReplaceParam("pMONTO", DBNull.Value.ToString().ToString());
            }
            else
            {
                vQp.AddReplaceParam("pMONTO", pMONTO);
            }
            if (pERROR == "")
            {
                vQp.AddReplaceParam("pERROR", DBNull.Value.ToString().ToString());
            }
            else
            {
                vQp.AddReplaceParam("pERROR", pERROR);
            }
            if (pREFERENCIA == "")
            {
                vQp.AddReplaceParam("pREFERENCIA", DBNull.Value.ToString());
            }
            else
            {
                vQp.AddReplaceParam("pREFERENCIA", pREFERENCIA);
            }
            //Jornada
            vQp.AddReplaceParam("pJORNADA", Program.Jornada.ToString());


            // Llama el procedimiento que almacena los datos dl pago en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_CREDITOEK_ECONS", vQp, "PDV");
        }
        #endregion

        #region mConsultar_Saldo
        private string mConsultar_Saldo(string pId_Cliente, string pValor_Compr, ref string pMsg)
        {
            string vRefer = mSec_CrediEk();
            string vSaldo = "0";
            string varUSRG = String.Empty, varPWDG = String.Empty, varURLE = String.Empty;
            try
            {
                Utils.QueryParams vQp = new LLNet.Utils.QueryParams();
                //CONSULTA LOS PARÁMETROS DE LA BD
                DataSet vdsB = GUI.CApp.bll.getDataSet("PDV", "C_PGEN", vQp);
                //
                object[] vdatos = new object[2];
                vdatos = vdsB.Tables[0].Rows[0].ItemArray;
                //
                varUSRG = vdatos[0].ToString();
                varPWDG = vdatos[1].ToString();
                varURLE = vdatos[2].ToString();
                //
                //WEB SERVICE CON SUS MÉTODOS
                GenesisCnx.Service vwsGenesis = new GenesisCnx.Service();
                vwsGenesis.Url = varURLE;
                XmlNode vNod = vwsGenesis.ConsultaSaldo(pId_Cliente, pValor_Compr, varUSRG, varPWDG);
                XmlNodeList vList = vNod.SelectNodes("/datos");
                if (vList.Count <= 0)
                {
                    pMsg = "No se encuentran datos";
                }
                foreach (XmlNode DATO in vList)
                {
                    // MessageBox.Show(DATO.InnerXml);
                    if (DATO.HasChildNodes)
                    {
                        XmlNode cod_estado = DATO.SelectSingleNode("cod_estado");
                        XmlNode desc_estado = DATO.SelectSingleNode("desc_estado");
                        XmlNode per_cedula = DATO.SelectSingleNode("per_cedula");
                        XmlNode per_nombre = DATO.SelectSingleNode("per_nombre");
                        XmlNode per_saldo_disp = DATO.SelectSingleNode("per_saldo_disp");
                        XmlNode per_saldo_post = DATO.SelectSingleNode("per_saldo_post");
                        XmlNode per_cuota_tmp = DATO.SelectSingleNode("per_cuota_tmp");
                        XmlNode err_cod_est = DATO.SelectSingleNode("err_cod_est");
                        XmlNode err_desc = DATO.SelectSingleNode("err_descripcion");

                        if (err_cod_est != null && err_cod_est.InnerText == "1")
                        {//CONSULTA CORRECTA
                            if (cod_estado != null && cod_estado.InnerText == "3")
                            {//TRANSACCION CORRECTA
                                vSaldo = per_saldo_disp.InnerText;

                                mRegistroBDCONSULTA((err_cod_est == null ? "" : err_cod_est.InnerText), (err_desc == null ? "" : err_desc.InnerText), 
                                    (cod_estado == null ? "" : cod_estado.InnerText), (desc_estado == null ? "" : desc_estado.InnerText), pId_Cliente.Trim(),
                                    (per_nombre == null ? "" : per_nombre.InnerText), (per_saldo_disp == null ? "" : per_saldo_disp.InnerText), 
                                    (per_saldo_post == null ? "" : per_saldo_post.InnerText), (per_cuota_tmp == null ? "" : per_cuota_tmp.InnerText), vRefer, pValor_Compr);
                            }
                            else
                            { //ERROR
                                pMsg = desc_estado.InnerText;
                                mRegistroBDCONSULTA((err_cod_est == null ? "" : err_cod_est.InnerText), (err_desc == null ? "" : err_desc.InnerText), (cod_estado == null ? "" : cod_estado.InnerText), 
                                    (desc_estado == null ? "" : desc_estado.InnerText), pId_Cliente, (per_nombre == null ? "" : per_nombre.InnerText), (per_saldo_disp == null ? "" : per_saldo_disp.InnerText),
                                    (per_saldo_post == null ? "" : per_saldo_post.InnerText),(per_cuota_tmp == null ? "" : per_cuota_tmp.InnerText), vRefer, pValor_Compr);
                            }
                        }
                        else
                        { //ERROR CONSULTA
                            pMsg = err_desc.InnerText;
                            mRegistroBDCONSULTA((err_cod_est == null ? "" : err_cod_est.InnerText), (err_desc == null ? "" : err_desc.InnerText), (cod_estado == null ? "" : cod_estado.InnerText),
                                (desc_estado == null ? "" : desc_estado.InnerText), pId_Cliente, (per_nombre == null ? "" : per_nombre.InnerText), (per_saldo_disp == null ? "" : per_saldo_disp.InnerText), 
                                (per_saldo_post == null ? "" : per_saldo_post.InnerText), (per_cuota_tmp == null ? "" : per_cuota_tmp.InnerText), vRefer, pValor_Compr);
                        }
                    }
                    else
                    {
                        pMsg = "No se obtiene datos";
                        mRegistroBDERRORCONSULTA(vRefer, pId_Cliente, pValor_Compr, "No se obtiene datos en el XML");
                    }
                }

                return vSaldo;
            }
            catch (Exception ex)
            {
                pMsg = ex.Message;
                mRegistroBDERRORCONSULTA(vRefer, pId_Cliente, pValor_Compr, ex.Message);
                return vSaldo = "0";
            }
        }
        #endregion

        #region mObtener_Saldo
        /// <summary>
        /// Verifica si el cliente fidelizado es credie y si lo es, obtiene su saldo
        /// </summary>
        /// <param name="pEs_Credie">Indica si el cliente fidelizado es credie o no</param>
        /// <param name="pTarjeta">Tarjeta cliente puntos</param>
        /// <returns></returns>
        public string mObtener_Saldo(ref bool pEs_Credie, string pTarjeta)
        {
            string vMsj = "", vResultado = "";
            try
            {
                QueryParams vParametro = new QueryParams();
                vParametro.AddReplaceParam("TARJETA", pTarjeta);

                // Obtiene el nit credie del cliente fidelizado
                string vNit_Credie = Convert.ToString(Helpers.Nvl(GUI.CApp.bll.GetSingleValue("EKO_F_CLIENTE_CREDIE", vParametro, "PDV"), "0"));

                if (vNit_Credie == "0")
                {
                    pEs_Credie = false;
                    vResultado = "0";
                }
                else
                {
                    pEs_Credie = true;
                    vResultado = mConsultar_Saldo(vNit_Credie, "1", ref vMsj);
                    LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
                    EventLogManuales.WriteLog("", "Credie.cs: " + vMsj);
                }

                return vResultado;
            }
            catch(Exception vError)
            {
                return vError.Message;
            }
        }
        #endregion
    }
}