using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GenesisCnx = LLNet.Tienda.wsGenesis;
using System.Xml;
using LLNet.GUI;
using LLNet.Utils;

namespace LLNet.Tienda.MainForms.Forms.CreditEko
{
    public partial class FrmCrediCuotsEk : Form
    {

        #region variables

        private string vDoc, vMont;

        public bool exito = false;//Indica si tiene crédito
        public string refer = "0";
        public string IdCliente = "";
        private string varUSRG, varPWDG, varURLE;

        #endregion

        public FrmCrediCuotsEk(string monto)
        {
            InitializeComponent();
            vMont = monto;
            txtId.Focus();
            LlenarParametros();
        }

        /// <summary>Obtiene los parámetros necesarios de cada tienda </summary>
        private void LlenarParametros()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            //CONSULTA LOS PARÁMETROS DE LA BD
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "C_PGEN", qp);

            object[] datos = new object[2];
            datos = dsB.Tables[0].Rows[0].ItemArray;

            varUSRG = datos[0].ToString();
            varPWDG = datos[1].ToString();
            varURLE = datos[2].ToString();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            exito = false;            
            this.Dispose();
        }

        private void btnAcptr_Click(object sender, EventArgs e)
        {            
            this.Dispose();
        }

        private void btnConsCli_Click(object sender, EventArgs e)
        {
            if (txtId.Text.Trim() != "" && txtTarjeta.Text.Trim() != "")
            {
                CApp.ShowMessage("Error: Favor ingresar solo un dato de búsqueda", "Tarjeta Puntos / Credi-E Ekono", false);
            }
            else
            {
                if (txtTarjeta.Text.Trim() != "")// tiene tarjeta
                    NitTarjeta();

                this.exito = false;

                Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                qp3.AddReplaceParam("pNitCredie", txtId.Text.Trim());

                string validaPaso = "1"; //continua con cualquier valor diferente de 0

                if (Helpers.Nvl(CApp.GetParam("VPCE"), "N").ToString() != "S") //parámetro que indica si se valida la asociación
                {// No valida según parámetro
                    validaPaso = "1";
                }
                else
                {//si valida segun parámetro
                    //Validar si el cliente esta asociado a un credie   
                    if (txtId.Text.Trim() != "")
                    {
                        validaPaso = (GUI.CApp.bll.GetSingleValue("VALIDACLICREDPTS", qp3, "PDV").ToString());
                    }
                    else
                    {
                        validaPaso = "0";
                    }
                }
                if (validaPaso == "0")
                {
                    CApp.ShowMessage("Se debe asociar el cliente credie con la tarjeta puntos ", "Tarjeta Puntos / Credi-E Ekono", true);
                    using (Forms.MisPuntos.frmAfiliacion vform = new Forms.MisPuntos.frmAfiliacion())
                    {
                        //vform.txtMTarjet.Text = txttarjsubnvl.Text.Trim();
                        vform.ShowDialog();
                    }
                }
                else
                {
                    Limpiartxt();
                    Crear_Pago(txtId.Text.Trim(), vMont);
                }
            }
        }

        private void Limpiartxt()
        {
            txtcedpass.Text = "";
            txtcuottent.Text = "";
            txtnombr.Text = "";
            txtsaldodisp.Text = "";
            txtsaldop.Text = "";            
        }

        //Crea una transaccion de pago por CrediCUOTAS
        private void Crear_Pago(string strit, string strvkrCompr)
        {
            if (strit == string.Empty)
            {
                CApp.ShowMessage("Favor ingresar un Cliente", "Error Credi-E", false);
            }
            else
            {
                IdCliente = "";

                string refer = Sec_CrediEk();
                try
                {
                    //WEB SERVICE CON SUS MÉTODOS
                    GenesisCnx.Service wsGenesis = new GenesisCnx.Service();
                    wsGenesis.Url = varURLE;
                    XmlNode nod = wsGenesis.ConsultaSaldo(strit, strvkrCompr, varUSRG, varPWDG);
                    XmlNodeList list = nod.SelectNodes("/datos");
                    if (list.Count <= 0)
                    {
                        this.exito = false;
                        CApp.ShowMessage("No se encuentran datos", "Error Credi-E", false);
                    }
                    foreach (XmlNode DATO in list)
                    {
                        // 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");

                            string codEstado = "", descEstado = "", erroCodEstado = "", errorDesc = "";

                            if (per_cedula != null)
                                txtcedpass.Text = per_cedula.InnerText;
                            if (per_cuota_tmp != null)
                                txtcuottent.Text = per_cuota_tmp.InnerText;
                            if (per_nombre != null)
                                txtnombr.Text = per_nombre.InnerText;
                            if (per_saldo_disp != null)
                                txtsaldodisp.Text = per_saldo_disp.InnerText;
                            if (per_saldo_post != null)
                                txtsaldop.Text = per_saldo_post.InnerText;
                            if (cod_estado != null)
                                codEstado = cod_estado.InnerText;
                            if (desc_estado != null)
                                descEstado = desc_estado.InnerText;
                            if (err_cod_est != null)
                                erroCodEstado = err_cod_est.InnerText;
                            if (err_desc != null)
                                errorDesc = err_desc.InnerText;

                            if (erroCodEstado == "1")
                            {//CONSULTA CORRECTA
                                if (codEstado == "3")
                                {//TRANSACCION CORRECTA
                                    this.exito = true;
                                    IdCliente = txtId.Text.Trim();
                                    this.refer = refer;
                                    RegistroBDCONSULTA(erroCodEstado, errorDesc, codEstado, descEstado, txtId.Text.Trim(), txtnombr.Text, txtsaldodisp.Text, txtsaldop.Text, txtcuottent.Text,
                                        refer, strvkrCompr);
                                }
                                else
                                { //ERROR
                                    this.exito = false;
                                    CApp.ShowMessage(desc_estado.InnerText, "Error CrediE", false);
                                    RegistroBDCONSULTA(erroCodEstado, errorDesc, codEstado, descEstado, txtId.Text, txtnombr.Text, txtsaldodisp.Text, txtsaldop.Text, txtcuottent.Text,
                                        refer, strvkrCompr);
                                }
                            }
                            else
                            { //ERROR CONSULTA
                                this.exito = false;
                                CApp.ShowMessage(err_desc.InnerText, "Error CrediE", false);
                                RegistroBDCONSULTA(erroCodEstado, errorDesc, codEstado, descEstado, txtId.Text, txtnombr.Text, txtsaldodisp.Text, txtsaldop.Text, txtcuottent.Text,
                                        refer, strvkrCompr);
                            }
                        }
                        else
                        {
                            this.exito = false;
                            CApp.ShowMessage("No se obtiene datos", "Error CrediE", false);
                            RegistroBDERRORCONSULTA(refer, txtId.Text, strvkrCompr, "No se obtiene datos en el XML");
                        }
                    }
                }
                catch (Exception ex)
                {
                    this.exito = false;
                    RegistroBDERRORCONSULTA(refer, txtId.Text, strvkrCompr, ex.Message);
                }
            }
        }


        //Registrar en BD la consulta de un crédito
        private void RegistroBDCONSULTA(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 qp = new LLNet.Utils.QueryParams();

            if (pERR_COD_ESTADO == "")
            {
                qp.AddReplaceParam("pERR_COD_ESTADO", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pERR_COD_ESTADO", pERR_COD_ESTADO);
            }
            if (pERR_DESC == "")
            {
                qp.AddReplaceParam("pERR_DESC", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pERR_DESC", pERR_DESC);
            }
            if (pCOD_ESTADO == "")
            {
                qp.AddReplaceParam("pCOD_ESTADO", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pCOD_ESTADO", pCOD_ESTADO);
            }
            if (pDESC_ESTADO == "")
            {
                qp.AddReplaceParam("pDESC_ESTADO", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pDESC_ESTADO", pDESC_ESTADO);
            }
            if (pPER_CEDULA == "")
            {
                qp.AddReplaceParam("pPER_CEDULA", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pPER_CEDULA", pPER_CEDULA);
            }
            if (pPER_NOMBRE == "")
            {
                qp.AddReplaceParam("pPER_NOMBRE", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pPER_NOMBRE", pPER_NOMBRE);
            }
            if (pPER_SALDO_DISP == "")
            {
                qp.AddReplaceParam("pPER_SALDO_DISP", "0");
            }
            else
            {
                qp.AddReplaceParam("pPER_SALDO_DISP", pPER_SALDO_DISP);
            }
            if (pPER_SALDO_POST == "")
            {
                qp.AddReplaceParam("pPER_SALDO_POST", "0");
            }
            else
            {
                qp.AddReplaceParam("pPER_SALDO_POST", pPER_SALDO_POST);
            }
            if (pPER_CUOTA_TMP == "")
            {
                qp.AddReplaceParam("pPER_CUOTA_TMP", "0");
            }
            else
            {
                qp.AddReplaceParam("pPER_CUOTA_TMP", pPER_CUOTA_TMP);
            }
            if (pREFERENCIA == "")
            {
                qp.AddReplaceParam("pREFERENCIA", "0");
            }
            else
            {
                qp.AddReplaceParam("pREFERENCIA", pREFERENCIA);
            }
            if (pMONTO == "")
            {
                qp.AddReplaceParam("pMONTO", "0");
            }
            else
            {
                qp.AddReplaceParam("pMONTO", pMONTO);
            }
            //Jornada
            qp.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", qp, "PDV");
        }

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

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

            if (pCEDULA == "")
            {
                qp.AddReplaceParam("pCEDULA", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pCEDULA", pCEDULA);
            }
            if (pMONTO == "")
            {
                qp.AddReplaceParam("pMONTO", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pMONTO", pMONTO);
            }
            if (pERROR == "")
            {
                qp.AddReplaceParam("pERROR", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pERROR", pERROR);
            }            
            if (pREFERENCIA == "")
            {
                qp.AddReplaceParam("pREFERENCIA", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pREFERENCIA", pREFERENCIA);
            }           
            //Jornada
            qp.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", qp, "PDV");
        }

        private string Sec_CrediEk()
        {
            string seccrdx = "";
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            seccrdx = Convert.ToString(GUI.CApp.bll.GetSingleValue("SEC_CREDCONSEK", qp, "PDV"));
            return seccrdx;
        }

        private void FrmCrediCuotsEk_KeyDown(object sender, KeyEventArgs e)
        { 
            if (e.KeyCode == Keys.Escape)
            {
                exito = false;
                this.Dispose();
            }
            if (e.KeyCode == Keys.F5)
            {                
                this.Dispose();
            }
                       
            if (e.Modifiers == Keys.Alt)
            {               
                if (e.KeyCode == Keys.B)
                    btnConsCli_Click(null, null);                
            }
            if (e.KeyCode == Keys.Enter)
            {
                btnConsCli_Click(null, null);
            }
        }

        /// <summary>Obtiene el Nit del Cliente CrediE</summary>
        private void NitTarjeta()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pTARJETA", txtTarjeta.Text);
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "WMS_CLITARJPTSCREDIE", qp);

            if (dsB.Tables.Count > 0)
            {
                if (dsB.Tables[0].Rows.Count > 0)
                {
                    int cantfila = dsB.Tables[0].Rows.Count;
                    if (cantfila < 1)
                    {//mas de 1 cédula                        
                        CApp.ShowMessage("Error: La tarjeta esta asociada a más de 1 cliente, favor reportarlo al departamento de soporte", "Tarjeta Puntos / Credi-E Ekono", false);
                    }
                    else
                    {//1 cédula
                        object[] datos = new object[1];
                        datos = dsB.Tables[0].Rows[0].ItemArray;
                        txtId.Text = datos[0].ToString();
                    }
                }
                else
                {
                    CApp.ShowMessage("Error: La tarjeta no posee cliente CrediE asociada", "Tarjeta Puntos / Credi-E Ekono", false);
                    return;
                }
            }
            else
            {
                CApp.ShowMessage("Error: La tarjeta no posee cliente CrediE asociada", "Tarjeta Puntos / Credi-E Ekono", false);
                return;
            }
        }

        private void txtTarjeta_TextChanged(object sender, EventArgs e)
        {
            txtId.Text = "";
        }

    }
}