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.Utils;
using LLNet.GUI;
using System.Threading;

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

        #region variables
        
        private string varUSRG, varPWDG, varURLE;

        #endregion

        public FrmAnulrEk(string tipo)
        {
            InitializeComponent();
            LlenarParametros();
            switch (tipo)
            {
                case "A":
                    LlenarGrid();
                    sbtnAnular.Visible = true;                   
                    break;
                case "R":
                    LlenarGridImp();
                    btnReimprimir.Visible = true;                   
                    break;
            }
        }

        #region LlenarGrid
        /// <summary>Llena el grid con los datos de los pagos con credix de la jornada
        /// </summary>
        private void LlenarGrid()
        {
            this.gcVouchers.DataSource = null;
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("pJORNADA", Program.Jornada.ToString());
            DataSet ds_datos = new DataSet();
            ds_datos = GUI.CApp.bll.getDataSet("PDV", "WMS_V_TRANSCREDITOEK", qp);

            if (ds_datos.Tables.Count > 0 && ds_datos.Tables[0].Rows.Count > 0)
                this.gcVouchers.DataSource = ds_datos.Tables[0];
        }
        
        /// <summary>Llena el grid con los datos de los pagos correctos y anulados con credix de la jornada
        /// </summary>
        private void LlenarGridImp()
        {
            this.gcVouchers.DataSource = null;
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("pJORNADA", Program.Jornada.ToString());
            DataSet ds_datos = new DataSet();
            ds_datos = GUI.CApp.bll.getDataSet("PDV", "WMS_V_TRANSACREDITOEK", qp);

            if (ds_datos.Tables.Count > 0 && ds_datos.Tables[0].Rows.Count > 0)
                this.gcVouchers.DataSource = ds_datos.Tables[0];
        }
        #endregion

        /// <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 sbtnAnular_Click(object sender, EventArgs e)
        {
            Anular_Trans();
            LlenarGrid();
        }

        //Anula una transaccion de pago 
        private void Anular_Trans()
        {
            if (this.gvVouchers.FocusedRowHandle >= 0)
            {
                string fact = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "FACTURA"));
                string REFERe = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA"));
                QueryParams qp = new QueryParams();
                qp.AddReplaceParam("pREFERENCIA", REFERe);
                string ValFecha = GUI.CApp.bll.GetSingleValue("VALFECCREDITOEK", qp, "PDV").ToString();
                //Valida que el comprobante sea del día
                if (ValFecha == "1")
                {
                    QueryParams qp2 = new QueryParams();
                    qp2.AddReplaceParam("pREFERENCIA", REFERe);
                    //Cantidad de comprobantes por factura
                    string scancompfac = GUI.CApp.bll.GetSingleValue("VAL_F_CANTCOMP", qp, "PDV").ToString();
                    int cancompfac = int.Parse(scancompfac);
                    if (fact == String.Empty || cancompfac > 1)
                    {
                        if (GUI.CApp.ValidateAccess("AnlrCrEk", "Anula un Pago Credi-E Ekono"))
                        {

                            /*
                             SELECT W.REFERENCIA, CG_F_PARAMETER_VALUE ('BREE') SUCURSAL, W.ID_TRANS_PROV, W.NIT_CLIENTE, W.NOMBRE, W.VALORCOMPRA,FECHA_TRANS,wms_p_factpedido(W.DOCUMENTO) FACTURA
                    FROM WMS_CREDITOEK_RPAGS W WHERE W.JORNADA = &&pJORNADA&& and W.ESTADO = 'C' order by referencia desc");
          */
                            //Número de autorización
                            string REFERENCIA = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA"));
                            //Número de autorización
                            string SUCURSAL = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "SUCURSAL"));
                            //string SUCURSAL = "24";
                            //Pin
                            string ID_TRANS_PROV = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "ID_TRANS_PROV"));
                            //Número de tarjeta enmascarado
                            string NIT_CLIENTE = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "NIT_CLIENTE"));
                            //Fecha de vencimiento
                            string NOMBRE = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "NOMBRE"));
                            //Número de referencia de la transacción
                            string VALORCOMPRA = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "VALORCOMPRA"));
                            //FECHA TRANSACCION
                            string FECHA_TRANS = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "FECHA_TRANS"));

                            string supervisor = "";
                            if (GUI.CApp.Sup != null && GUI.CApp.Sup != "")
                            {
                                supervisor = GUI.CApp.Sup;
                            }
                            else
                            {
                                supervisor = GUI.CApp.usuario;
                            }

                            try
                            {
                                //WEB SERVICE CON SUS MÉTODOS
                                GenesisCnx.Service wsGenesis = new GenesisCnx.Service();
                                wsGenesis.Url = varURLE;
                                XmlNode nod = wsGenesis.AnulaCompra(ID_TRANS_PROV, "F", SUCURSAL, CApp.usuario, Program.Caja.ToString(), Program.Jornada.ToString(), NIT_CLIENTE, VALORCOMPRA, FECHA_TRANS, varUSRG, varPWDG);
                                XmlNodeList list = nod.SelectNodes("/datos");
                                foreach (XmlNode DATO in list)
                                {
                                    //MessageBox.Show(DATO.InnerXml);
                                    if (DATO.HasChildNodes)
                                    {/*
                              <err_cod_estado>05</err_cod_estado><err_descripcion>Datos Incorrectos</err_descripcion>
                              */
                                        XmlNode cod_estado = DATO.SelectSingleNode("cod_estado");
                                        XmlNode desc_estado = DATO.SelectSingleNode("desc_estado");
                                        XmlNode err_cod_est = DATO.SelectSingleNode("err_cod_est");
                                        XmlNode err_desc = DATO.SelectSingleNode("err_desc");
                                        XmlNode id_trans_anulacion = DATO.SelectSingleNode("id_trans_anulacion");
                                        XmlNode tran_jornada = DATO.SelectSingleNode("tran_jornada");
                                        XmlNode tran_cedula = DATO.SelectSingleNode("tran_cedula");
                                        XmlNode tran_nombre = DATO.SelectSingleNode("tran_nombre");
                                        XmlNode tran_monto = DATO.SelectSingleNode("tran_monto");
                                        XmlNode tran_fecha = DATO.SelectSingleNode("tran_fecha");

                                        string codestado = "", descestado = "", errcodest = "", errdesc = "", idtransanulacion = "";

                                        if (cod_estado != null)
                                            codestado = cod_estado.InnerText;
                                        if (desc_estado != null)
                                            descestado = desc_estado.InnerText;
                                        if (err_cod_est != null)
                                            errcodest = err_cod_est.InnerText;
                                        if (err_desc != null)
                                            errdesc = err_desc.InnerText;
                                        if (id_trans_anulacion != null)
                                            idtransanulacion = id_trans_anulacion.InnerText;

                                        if (errcodest == "1")
                                        {//CONSULTA CORRECTA
                                            if (codestado == "1")
                                            {//TRANSACCION CORRECTA
                                                //this.exito = true;

                                                RegBDAnul(REFERENCIA, CApp.usuario.ToString(), ID_TRANS_PROV, idtransanulacion);
                                                //IMPRIME EL COMPROBANTE DE ANULACION
                                                imprimirAVCREDITOEK(REFERENCIA);
                                            }
                                            else
                                            { //ERROR
                                                // this.exito = false;
                                                CApp.ShowMessage(descestado, "Error Credi-E", false);
                                                RegBDERRORCREDEK(errcodest, errdesc, codestado, descestado, REFERENCIA, "", "ANULACION");
                                            }
                                        }
                                        else
                                        { //ERROR CONSULTA
                                            //this.exito = false;
                                            CApp.ShowMessage(errdesc, "Error Credi-E", false);
                                            RegBDERRORCREDEK(errcodest, errdesc, codestado, descestado, REFERENCIA, "", "ANULACION");
                                        }
                                    }
                                    else
                                    {
                                        //this.exito = false;
                                        CApp.ShowMessage("No se obtiene datos", "Error Credi-E", false);
                                        RegBDERRORCREDEK("", "", "", "", REFERENCIA, "No se obtiene datos del XML", "ANULACION");
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                CApp.ShowMessage(ex.Message, "Error Credi-E", false);
                                RegBDERRORCREDEK("", "", "", "", REFERENCIA, ex.Message, "ANULACION");
                            }
                        }
                        else
                        {
                            CApp.ShowMessage("No tienes permisos para realizar la anulación", "Pagos Credi-E Ekono", false);
                        }
                    }
                    else
                        CApp.ShowMessage("No se puede anular un pago Credi-E asociado a una factura/recibo", "Pagos Credi-E Ekono", false);
                }
                else
                    CApp.ShowMessage("No se puede anular un pago Credi-E que no sea del día", "Pagos Credi-E Ekono", false);
            }
        }

        private void RegBDAnul(string pREFERENCIA, string pUSUARIO, string pID_TRANS_PROV, string pID_TRANS_ANUL)
        {      /*
                (&&pREFERENCIA&& , '&&pUSUARIO&&' , '&&pID_TRANS_PROV&&' ,&&pID_TRANS_ANUL&& );
                */
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();

            if (pREFERENCIA == "")
            {
                qp.AddReplaceParam("pREFERENCIA", "0");
            }
            else
            {
                qp.AddReplaceParam("pREFERENCIA", pREFERENCIA);
            }
            if (pUSUARIO == "")
            {
                qp.AddReplaceParam("pUSUARIO", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pUSUARIO", pUSUARIO);
            }
            if (pID_TRANS_PROV == "")
            {
                qp.AddReplaceParam("pID_TRANS_PROV", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pID_TRANS_PROV", pID_TRANS_PROV);
            }
            if (pID_TRANS_ANUL == "")
            {
                qp.AddReplaceParam("pID_TRANS_ANUL", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pID_TRANS_ANUL", pID_TRANS_ANUL);
            }   
            
            // Llama el procedimiento que almacena los datos dl pago en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_CREDITOEK_IAPAGS", qp, "PDV");
        }

        //Registrar en BD UN ERROR DE CREDITO EKONO
        private void RegBDERRORCREDEK(string pERR_COD_ESTADO, string pERR_DESC, string pCOD_ESTADO,
            string pDESC_ESTADO, string pREFERENCIA, string pERROR, string pWS)
        {
            /*
              &&pREFERENCIA&&, &&pJORNADA&& ,
                    '&&pCOD_ESTADO&&' , '&&pDESC_ESTADO&&', '&&pERR_COD_EST&&' , 
                    '&&pERR_DESC&&', '&&pWS&&','&&pERROR&&'
             */
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();

            if (pERR_COD_ESTADO == "")
            {
                qp.AddReplaceParam("pERR_COD_EST", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pERR_COD_EST", 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 (pERROR == "")
            {
                qp.AddReplaceParam("pERROR", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pERROR", pERROR);
            }
            if (pWS == "")
            {
                qp.AddReplaceParam("pWS", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pWS", pWS);
            }
            if (pREFERENCIA == "")
            {
                qp.AddReplaceParam("pREFERENCIA", "0");
            }
            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_ERROR", qp, "PDV");
        }

        #region imprimirVoucher
        private void imprimirVCREDITOEK(string id)
        {
            try
            {
                object FormatoTipoImpresion = null;
                QueryParams qparams = new LLNet.Utils.QueryParams();
                qparams = new LLNet.Utils.QueryParams();
                qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VFCE");
                Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qparams), dsDocTienda);
                string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                imprimirVoucher(Convert.ToInt64(id), "", Convert.ToInt64(format));
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Vouchers Pago con CrediCuotas Ekono", false);
            }
        }

        private void imprimirAVCREDITOEK(string id)
        {
            try
            {
                object FormatoTipoImpresion = null;
                QueryParams qparams = new LLNet.Utils.QueryParams();
                qparams = new LLNet.Utils.QueryParams();
                qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'CAFC");
                Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qparams), dsDocTienda);
                string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                imprimirVoucher(Convert.ToInt64(id), "", Convert.ToInt64(format));
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Comprobante de Anulación Pago con Credi-E Ekono", false);
            }
        }

        /// <summary> Imprime el voucher</summary>
        /// <param name="voucher">Id voucher</param>
        /// <param name="Impresora"></param>
        /// <param name="formato">Formato impresión</param>
        private void imprimirVoucher(long voucher, string Impresora, long formato)
        {
            string Ruta = Application.StartupPath;
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            if (Ruta != string.Empty)
            {
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(Ruta + "\\" + "imprimir.bat ");
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

                string Args = "";
                string varTipoTxt = Utils.Helpers.ObjToStr(GUI.CApp.GetParam("TTXT"));

                if (varTipoTxt == "U") // SI EL TIPO DE GENERACION DE ARCHIVO ES POR USUARIO O DOCUMENTO
                {
                    Args = GUI.CApp.usuario + ".txt ";
                }
                else
                {
                    long pDocumento = voucher;
                    Args = pDocumento + ".txt ";
                }

                startInfo.Arguments = Args;
                try
                {
                    qp.AddReplaceParam("ID_TR_TARJ", voucher.ToString());
                    qp.AddReplaceParam("FORMATO", formato.ToString());
                    qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                    GUI.CApp.bll.ExecuteSql("WMS_P_GENERAR_IMPRVO", qp, "PDV");
                    Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                    System.Diagnostics.Process.Start(startInfo);

                    #region Imprimir copia voucher
                    string valor = Helpers.Nvl(CApp.GetParam("HCV"), "").ToString();
                    if (valor == "1")//Si valor es 1, se imprime la copia del voucher
                    {
                        qp.AddReplaceParam("ID_TR_TARJ", voucher.ToString());
                        qp.AddReplaceParam("FORMATO", formato.ToString());
                        qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                        GUI.CApp.bll.ExecuteSql("WMS_P_GENERAR_IMPRVO", qp, "PDV");
                        Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                        System.Diagnostics.Process.Start(startInfo);
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    GUI.CApp.ShowMessage(ex.Message, "Impresion de Documentos", false);
                }
            }
            else
            {
                throw new Exception("No esta Definido el Parametro UATI");
            }
        }
        #endregion

        private void btnReimprimir_Click(object sender, EventArgs e)
        {
            string referencia = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA"));
            string estado = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "ESTADO"));
            if (estado == "CORRECTO")
            {
                //IMPRIME VOUCHER
                imprimirVCREDITOEK(referencia);
            }
            else
            {
                //IMPRIME EL COMPROBANTE DE ANULACION
                imprimirAVCREDITOEK(referencia);
            }
        }

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

        private void FrmAnulrEk_KeyDown(object sender, KeyEventArgs e)
        {            
            if (e.Modifiers == Keys.None)
            {
                switch (e.KeyCode)
                {
                    case Keys.F5:
                        if (sbtnAnular.Visible == true)
                            sbtnAnular_Click(null,null);
                        break;
                    case Keys.F6:
                        if (btnReimprimir.Visible == true)
                            btnReimprimir_Click(null,null);
                        break;
                    case Keys.Escape:
                        btnCancelar.PerformClick();
                        break;
                }
            }
        }

    }
}