using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using LLNet.Utils;
using LLNet.GUI;
using Microsoft.Win32;
using System.Threading;

namespace LLNet.Tienda.MainForms.Forms
{
    public partial class FrmBCROpcs : Form
    {
        public FrmBCROpcs(string tipo)
        {
            InitializeComponent();

            switch (tipo)
            {
                case "A":
                    sbtnAnular.Visible = true;
                    break;
                case "R":
                    btnReimprimir.Visible = true;
                    break;
            }
        }

        #region LlenarGrid
        /// <summary>
        /// Llena el grid con los datos de los vouchers de la jornada
        /// </summary>
        private void LlenarGrid()
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("JORNADA", Program.Jornada.ToString());
            DataSet ds_datos = new DataSet();
            ds_datos = GUI.CApp.bll.getDataSet("PDV", "WMS_V_VOUCHERS_BCR", qp);

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

        #region Anulacion
        /// <summary>
        /// Se realiza la anulación de una transacción del BCR
        /// </summary>
        private void Anulacion()
        {
            if (this.gvVouchers.FocusedRowHandle >= 0)
            {
                string fact = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "FACTURA"));

                if (fact == " ")
                {
                    if (GUI.CApp.ValidateAccess("AnulacionTrans", "Anulación de pagos con tarjeta"))
                    {
                        //Número de autorización
                        string NumAutoriz = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "AUTORIZACION"));
                        //Número de tarjeta enmascarado
                        string NumTarj = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "TARJETA"));
                        //Número de referencia de la transacción
                        string NumRef = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA"));
                        //Monto transacción
                        string MontoTrans = Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "MONTO"));
                        string Id_tr_tarj = "";

                        string supervisor = "";
                        if (GUI.CApp.Sup != null && GUI.CApp.Sup != "")
                            supervisor = GUI.CApp.Sup;

                        if (MontoTrans == "")
                            MontoTrans = "0";

                        QueryParams qparams = new QueryParams();
                        qparams.AddReplaceParam("TARJETA", NumTarj);
                        qparams.AddReplaceParam("AUTORIZACION", NumAutoriz);
                        qparams.AddReplaceParam("REFERENCIA", NumRef);
                        object caja = gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "CAJA");
                        //Verifica si la venta con esos datos existe
                        if (caja == null)
                        {
                            CApp.ShowMessage("No existe una transacción con esos datos", "Anulación de Documentos", true);
                        }
                        else
                        {
                            if (decimal.Parse(caja.ToString()) == 0)
                            {
                                CApp.ShowMessage("No existe una transacción con esos datos", "Anulación de Documentos", true);
                            }
                            else if (decimal.Parse(caja.ToString()) != Program.Caja)
                            {
                                CApp.ShowMessage("Debe hacer la anulación en la misma caja que se hizo la transacción", "Anulación de Documentos", true);
                            }
                            else
                            {
                                object anulada = GUI.CApp.bll.GetSingleValue("ExisteAnulacion", qparams, "PDV");
                                //
                                if (anulada == null)
                                {
                                    CApp.ShowMessage("La transacción ya fue anulada o los datos son erróneos", "Anulación de Documentos", true);
                                }
                                else
                                {
                                    if (int.Parse(anulada.ToString()) == 1)
                                    {
                                        CApp.ShowMessage("La transacción ya fue anulada", "Anulación de Documentos", true);
                                    }
                                    else
                                    {
                                        #region BCR
                                        qparams = new QueryParams();
                                        qparams.AddReplaceParam("ID_TR_TARJ", Convert.ToString(gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "ID")));
                                        string tarj = Helpers.Nvl(GUI.CApp.bll.GetSingleValue("ObtTarj", qparams, "PDV"), "").ToString();

                                        if (tarj != "")
                                        {

                                            #region
                                            qparams = new QueryParams();
                                            Id_tr_tarj = GUI.CApp.bll.GetSingleValue("Sig_Id_tr_tarj", "PDV").ToString();
                                            qparams.AddReplaceParam("ID_TR_TARJ", Id_tr_tarj);
                                            if (gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "DOCUMENTO").ToString() == "")
                                                qparams.AddReplaceParam("DOCUMENTO", "0");
                                            else
                                                    qparams.AddReplaceParam("DOCUMENTO", gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "DOCUMENTO").ToString());
                                            qparams.AddReplaceParam("CAJA", Program.Caja.ToString());
                                            qparams.AddReplaceParam("TIPO", "Anulación");
                                            if (supervisor != null && supervisor != "")
                                                qparams.AddReplaceParam("USUARIO", supervisor);
                                            else
                                                qparams.AddReplaceParam("USUARIO", GUI.CApp.usuario);
                                            qparams.AddReplaceParam("MONTO", MontoTrans);
                                            qparams.AddReplaceParam("ESTADO", "Pendiente");
                                            qparams.AddReplaceParam("EMISOR", "3");
                                            qparams.AddReplaceParam("JORNADA", Program.Jornada.ToString());
                                            #endregion
                                            //
                                            GUI.CApp.bll.ExecuteSql("Ini_Log_Tarjetas_Anul", qparams, "PDV");

                                            LLNet.Tienda.MainForms.Forms.FrmBCR fbcr = new LLNet.Tienda.MainForms.Forms.FrmBCR(MontoTrans, tarj, NumTarj,
                                                NumAutoriz, NumRef, Id_tr_tarj, gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "TARJETAHABIENTE").ToString(),
                                                gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "SYSTEMTRACE").ToString());
                                            fbcr.ShowDialog();
                                            bool realizado = fbcr.exito;

                                            #region (NO)Aprobado
                                            if (realizado)
                                            {
                                                qparams = new QueryParams();
                                                //Datos fin del proceso de pago con tarjeta de crédito/débito
                                                qparams.AddReplaceParam("ID_TR_TARJ", Id_tr_tarj);
                                                qparams.AddReplaceParam("TARJETA", NumTarj);
                                                qparams.AddReplaceParam("AUTORIZACION", NumAutoriz);
                                                qparams.AddReplaceParam("REFERENCIA", NumRef);
                                                qparams.AddReplaceParam("ESTADO", "Aprobada");
                                                qparams.AddReplaceParam("ERRORES", "");
                                                //
                                                GUI.CApp.bll.ExecuteSql("Fin_Log_Tarjetas", qparams, "PDV");

                                                #region Impresión vouchers anulados BCR
                                                object FormatoTipoImpresion = null;
                                                qparams = new LLNet.Utils.QueryParams();
                                                qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOO");
                                                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_tr_tarj), "", Convert.ToInt64(format));
                                                #endregion

                                                LlenarGrid();
                                            }
                                            else
                                            {
                                                qparams = new QueryParams();
                                                qparams.AddReplaceParam("ID_TR_TARJ", Id_tr_tarj);
                                                qparams.AddReplaceParam("TARJETA", NumTarj);
                                                qparams.AddReplaceParam("AUTORIZACION", NumAutoriz);
                                                qparams.AddReplaceParam("REFERENCIA", NumRef);
                                                qparams.AddReplaceParam("ESTADO", "Denegada");
                                                qparams.AddReplaceParam("ERRORES", fbcr.Motivo);
                                                //
                                                GUI.CApp.bll.ExecuteSql("Fin_Log_Tarjetas", qparams, "PDV");

                                                CApp.ShowMessage("Transacción denegada", "Cobros y Facturación", true);
                                            }
                                            #endregion
                                        }
                                        else
                                            CApp.ShowMessage("No se puede realizar este proceso", "Vouchers BCR", true);
                                        #endregion
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        CApp.ShowMessage("No se puede realizar la anulación", "Vouchers BCR", true);
                    }
                }
                else
                    CApp.ShowMessage("No se puede anular un voucher asociado a una factura/recibo", "Vouchers BCR", true);
            }
        }
        #endregion

        #region imprimirVoucher IGF
        /// <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
                    {
                        object FormatoTipoImpresion = null;
                        RegistryKey keyImp = Registry.CurrentUser;

                        keyImp = keyImp.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
                        if (keyImp != null)
                        {
                            if (Convert.ToString(keyImp.GetValue("FormatoTipoImpresion", null)) != "")
                            {
                                FormatoTipoImpresion = keyImp.GetValue("FormatoTipoImpresion");
                            }
                        }

                        qp = new LLNet.Utils.QueryParams();
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOC");
                        Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                        Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);
                        string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                        qp.AddReplaceParam("ID_TR_TARJ", voucher.ToString());
                        qp.AddReplaceParam("FORMATO", format.ToString());
                        qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                        Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                        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

        #region FrmBCROpcs_Load
        private void FrmBCROpcs_Load(object sender, EventArgs e)
        {
            try
            {
                LlenarGrid();   
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Vouchers BCR", true);
            }
        }
        #endregion

        #region FrmBCROpcs_KeyDown
        private void FrmBCROpcs_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F5:
                    if(this.sbtnAnular.Visible)
                        sbtnAnular_Click(null, null);
                    break;
                case Keys.F6:
                    if(this.btnReimprimir.Visible)
                        btnReimprimir_Click(null, null);
                    break;
                case Keys.Escape:
                    btnCancelar_Click(null, null);
                    break;
            }
        }
        #endregion

        #region sbtnAnular_Click
        private void sbtnAnular_Click(object sender, EventArgs e)
        {
            try
            {
                Anulacion();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Vouchers BCR", true);
            }
        }
        #endregion

        #region btnReimprimir_Click
        private void btnReimprimir_Click(object sender, EventArgs e)
        {
            try
            {
                #region Impresión vouchers anulados BCR
                QueryParams qparams = new LLNet.Utils.QueryParams();
                qparams.AddReplaceParam("AUTORIZACION", gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "AUTORIZACION").ToString());
                qparams.AddReplaceParam("REFERENCIA", gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "REFERENCIA").ToString());

                string id = Helpers.Nvl(CApp.bll.GetSingleValue("ObtAnul", qparams, "PDV"), "").ToString();

                if (id == "")
                    id = gvVouchers.GetRowCellValue(gvVouchers.FocusedRowHandle, "ID").ToString();

                object FormatoTipoImpresion = null;
                qparams = new LLNet.Utils.QueryParams();
                qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOO");
                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));
                #endregion
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Vouchers BCR", true);
            }
        }
        #endregion

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