using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using LLNet.GUI;
using LLNet.Utils;
using System.Threading;
using AloExpress = LLNet.Tienda.Aloprepago.AloExpress;
using System.IO;
using System.Xml.Serialization;

namespace LLNet.Tienda.MainForms.Forms.Monedero
{
    public partial class FrmAnulrMnd : Form
    {

        #region variables
        private string varEntMEA, varUsrMEA, varPwdMEA, varMontoR, varDoc, varMoned;
        #endregion


        public FrmAnulrMnd(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_PM", qp);

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

            varEntMEA = datos[0].ToString();
            varUsrMEA = datos[1].ToString();
            varPwdMEA = datos[2].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_TRANSMONEDEROALO", 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();     
        }

        private void btnReimprimir_Click(object sender, EventArgs e)
        {
            if (this.gvVouchers.FocusedRowHandle >= 0)
            {
               //Numero Referencia Monedero Alo
                string referencia = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA"));
                imprimir(referencia);
            }
            else
            {
                CApp.ShowMessage("Seleccione un Pago con el Monedero Aló para realizar la reimpresión", "Pagos Monedero Aló", false);
            }
        }

        #region imprimirVoucher

        private void imprimir(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 = 'VMA");
                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 Monedero Aló", 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

        //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"));

                if (fact == String.Empty)
                {
                    if (GUI.CApp.ValidateAccess("AnlrMA", "Anula un Pago con Monedero Alo"))
                    {
                        //Número de referencia de la transacción
                        string NumRef = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA"));
                        string Id_tr_tarj = "";
                      
                        string supervisor = "";
                        if (GUI.CApp.Sup != null && GUI.CApp.Sup != "")
                        {
                            supervisor = GUI.CApp.Sup;
                        }
                        else
                        {
                            supervisor = GUI.CApp.usuario;
                        }

                        //WEB SERVICE CON SUS MÉTODOS
                        AloExpress.INTEGRACIONSP WSMONEDEROAE = new AloExpress.INTEGRACIONSP();

                        //Datos de seguridad
                        AloExpress.tipoInfoSeguridad TS = new AloExpress.tipoInfoSeguridad();
                        TS.Entidad = varEntMEA;
                        TS.Usuario = varUsrMEA;
                        TS.Clave = varPwdMEA;                        

                        AloExpress.tipoInfoServicio TIS = new AloExpress.tipoInfoServicio();
                        TIS.Referencia = NumRef;
                        TIS.Servicio = "29";
                        
                        AloExpress.ReversarServicio RS = new AloExpress.ReversarServicio();
                        RS.InfoServicio = TIS;
                        RS.InfoSeguridad = TS;  
                        
                        AloExpress.ServicioReversadoOutput PSerRes = WSMONEDEROAE.ReversarServicio(RS);
                      
                        //Crear un objeto serializado para la clase contactos
                        XmlSerializer objWriter = new XmlSerializer(typeof(AloExpress.ReversarServicio));
                        //Crear un objeto file de tipo StremWriter para almacenar el documento xml
                        StreamWriter objfile = new StreamWriter("C://ReversarServicio1.xml");
                        //Serializar y crear el documento XML
                        objWriter.Serialize(objfile, RS);
                        //Cerrar el archivo
                        objfile.Close();

                        //Crear un objeto serializado para la clase contactos
                        XmlSerializer objWriter2 = new XmlSerializer(typeof(AloExpress.ServicioReversadoOutput));
                        //Crear un objeto file de tipo StremWriter para almacenar el documento xml
                        StreamWriter objfile2 = new StreamWriter("C://ReversarServicioOutput1.xml");
                        //Serializar y crear el documento XML
                        objWriter2.Serialize(objfile2, PSerRes);
                        //Cerrar el archivo
                        objfile2.Close();
                        
                        string estad = "A";
                            if ( PSerRes.ErrorCodigo == "00")
                            {
                                //Almacena la respuesta y la anulacion
                                RegistroBDAPago(NumRef, supervisor);
                            }
                            else
                            {
                                CApp.ShowMessage("No se puede realizar la anulación " + PSerRes.ErrorDes, "Pagos Monedero Aló", false);
                            }                                             
                    }
                    else
                    {
                        CApp.ShowMessage("No tienes permisos para realizar la anulación", "Pagos Monedero Aló", false);
                    }
                }
                else
                    CApp.ShowMessage("No se puede anular un pago con el Monedero Aló asociado a una factura/recibo", "Pagos Monedero Aló", false);
            }
        }

        //Registrar en BD la transaccion Anulacion Pago con monedero Aló
        private void RegistroBDAPago(string refer, string usrauto)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();            
            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_IATMONEDEROALO", qp, "PDV");
        }


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

        private void FrmAnulrMnd_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;
            }
        }
    }
}