using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CredixCnx = LLNet.Tienda.com.credix.qaconectividad;
using System.Net;
using LLNet.Utils;
using LLNet.GUI;
using System.Threading;

namespace LLNet.Tienda.MainForms.Forms.Credix
{
    public partial class FrmAnulrCdx : Form
    {
        #region variables
        private string varUsrC, varPwdC, varFV, varCVV, varMont, varMoned, vUrl;
        #endregion

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

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

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

            varUsrC = datos[0].ToString();
            varPwdC = datos[1].ToString();
        }

        #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("JORNADA", Program.Jornada.ToString());
            DataSet ds_datos = new DataSet();
            ds_datos = GUI.CApp.bll.getDataSet("PDV", "WMS_V_TRANSCREDIX", qp);

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

        private void sbtnAnular_Click(object sender, EventArgs e)
        {
            Anular_Trans();
            LlenarGrid();                      
        }
        

        //Anula una transaccion de pago por Credix con Tarjeta
        private void Anular_Trans()
        {  
            if (this.gvVouchers.FocusedRowHandle >= 0)
            {
                string fact = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "FACTURA"));
                string fecha = GUI.CApp.bll.GetSingleValue("CREDIX_FECHA", "PDV").ToString(); 
               //string fact = "";
                if (fact == String.Empty)
                {
                    if (GUI.CApp.ValidateAccess("AnlrCrdx", "Anula un Pago con Credix"))
                    {
                        //Número de autorización
                        string nauto = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "AUTORIZACION"));
                        //Pin
                        string npin = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "PIN"));
                        //Número de tarjeta enmascarado
                        string numtarj = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "NUMTAR"));
                        //Fecha de vencimiento
                        string fven = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "FECHA"));
                        //Número de referencia de la transacción
                        string NumRef = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA"));
                        //Monto transacción
                        string imprt = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "IMPORTE"));
                        //Moneda
                        string moned = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "MONEDA"));
                        //Numero Credix
                        string numcrdx = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "NUM_CRDX"));
                                                
                        string Id_tr_tarj = "";

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

                        if (fecha != fven)
                        {
                            CApp.ShowMessage("El voucher es de una fecha anterior a la actual", "Pagos Credix", true);

                        }
                        else
                        {
                            vUrl = Helpers.Nvl(CApp.GetParam("URLX"), "").ToString();
                            //WEB SERVICE CON SUS MÉTODOS
                            CredixCnx.Webservices_Model_WsService WSCredix = new CredixCnx.Webservices_Model_WsService();
                            WSCredix.Url = vUrl;
                            WSCredix.Credentials = new NetworkCredential(varUsrC, varPwdC);
                            if (numtarj != "")
                            {//Anulacion de transaccion con Tarjeta
                                //string resp = WSCredix.delete_transaction(varUsrC, varPwdC, numtarj, fven, nauto, imprt, moned, "S");
                                string resp = WSCredix.delete_transaction_without_cardnumber(varUsrC, varPwdC, imprt, fven, nauto, moned, "S");
                                string estad = "A";
                                if (resp.Substring(0, 2) == "00")
                                {
                                    //Almacena la respuesta y la anulacion
                                    RegistroBDAPagoTarj(resp, NumRef, supervisor);
                                }
                                else
                                {
                                    CApp.ShowMessage("No se puede realizar la anulación " + resp, "Pagos Credix", false);
                                }
                            }
                            else
                            {//Anulacion de transaccion con Pin
                                string resp = WSCredix.delete_transaction_pin(varUsrC, varPwdC, nauto, numcrdx, imprt, moned, "S");
                                string estad = "A";
                                if (resp.Substring(0, 2) == "00")
                                {
                                    //Almacena la respuesta y la anulacion
                                    RegistroBDAPagoTarj(resp, NumRef, supervisor);
                                }
                                else
                                {
                                    CApp.ShowMessage("No se puede realizar la anulación " + resp, "Pagos Credix", false);
                                }
                            }
                        }
                    }
                    else
                    {
                        CApp.ShowMessage("No tienes permisos para realizar la anulación", "Pagos Credix", false);
                    }
                }
                else
                    CApp.ShowMessage("No se puede anular un pago Credix asociado a una factura/recibo", "Pagos Credix", false);
            }
        }


        //Registrar en BD la transaccion Pago con tarjeta CREDIX
        private void RegistroBDAPagoTarj(string resp, string refer, string usrauto)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            if (resp == "")
            { 
                qp.AddReplaceParam("presp", DBNull.Value.ToString().ToString());
            }
            else
            {               
                qp.AddReplaceParam("presp", resp);
            }          
            if (refer == "")
            {
                qp.AddReplaceParam("prefer", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("prefer", refer);
            }            
            if (usrauto == "")
            {
                qp.AddReplaceParam("pusrauto", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pusrauto", usrauto);
            }
            //Jornada
            qp.AddReplaceParam("pjornada", Program.Jornada.ToString());           
            
            //Llama el procedimiento que almacena los datos dl Anulacion en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_IATRACREDIX", qp, "PDV");
        }

        private void FrmAnulrCdx_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F6:
                    btnReimprimir_Click(null, null);
                    break;       
                case Keys.F5:
                    if (sbtnAnular.Visible == true)
                    sbtnAnular_Click(null, null);
                    break;               
                case Keys.Escape:
                    btnCancelar_Click(null, null);
                    break;
            }
        }

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

        private void btnReimprimir_Click(object sender, EventArgs e)
        {
            if (this.gvVouchers.FocusedRowHandle >= 0)
            {
                //Pin
                string npin = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "PIN"));
                //Número de tarjeta enmascarado
                string numtarj = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "NUMTAR"));
                //Numero Credix
                string referencia = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA"));
                if (numtarj != string.Empty)
                {//si tiene pago con tarjeta
                    imprimir(referencia, true);
                }
                else
                {//Pago con pin
                    imprimir(referencia, false);
                }
            }
            else
            {
                CApp.ShowMessage("Seleccione un Pago con Credix para realizar la reimpresión", "Pagos Credix", false);
            }
        }

        #region imprimirVoucher

        private void imprimir(string id, bool tarj)
        {
            try
            {
                if (tarj)
                {//pago con tarjeta
                    object FormatoTipoImpresion = null;
                    QueryParams qparams = new LLNet.Utils.QueryParams();
                    qparams = new LLNet.Utils.QueryParams();
                    qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VCX");
                    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));
                }
                else
                {//pago con pin
                    object FormatoTipoImpresion = null;
                    QueryParams qparams = new LLNet.Utils.QueryParams();
                    qparams = new LLNet.Utils.QueryParams();
                    qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VCXP");
                    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 Credix", true);
            }
        }


        /// <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", true);
                }
            }
            else
            {
                throw new Exception("No esta Definido el Parametro UATI");
            }
        }
        #endregion

        private void gvVouchers_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
                
        }

        private void lbCaption_Click(object sender, EventArgs e)
        {

        }


    }
}