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

namespace LLNet.Tienda.MainForms.Forms
{
    public partial class frmConstanciaRegalo : Form
    {
        public string Documento;
        public string Linea;
        public string EsquemaC;
        public string FechaE;

        public frmConstanciaRegalo()
        {
            InitializeComponent();

            #region Limpiando el dataset
            dsPDV1.TDA_V_FACTURAS.Clear();
            dsPDV1.TDA_DETALLE_PEDIDO.Clear();
            #endregion

            EsquemaC = Utils.Helpers.ObjToStr(GUI.CApp.GetParam("NDEC"));
        }

        #region btnCancelar_Click
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }
        #endregion

        #region frmConstanciaRegalo_KeyDown
        private void frmConstanciaRegalo_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Enter:
                    btnConsultar_Click(null, null);
                    break;
                case Keys.F2:
                    vGridControl1.FocusedRow = merFactura;
                    vGridControl1.ShowEditor();
                    vGridControl1.Focus();
                    if (vGridControl1.ActiveEditor.Text == Utils.Helpers.ObjToStr(merFactura.PropertiesCollection[1].Value))
                    {
                        SendKeys.Send("{LEFT}");
                    }
                    break;
                case Keys.Escape:
                    btnCancelar_Click(null, null);
                    break;
                case Keys.F12:
                    btnAceptar_Click(null, null);
                    break;
            }
        }
        #endregion

        #region FindFactura
        public bool FindFactura(string pSerie, string pFactura)
        {
            #region Asignando parametros para busqueda del documento
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("SERIE", pSerie.ToString());
            qp.AddReplaceParam("NO_DOCUMENTO", pFactura.ToString());
            #endregion

            dsPDV1.TDA_V_FACTURAS.Clear();
            if (pSerie != "")
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_FACTURAS.TableName, qp, "Factura"), dsPDV1);
            else
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_FACTURAS.TableName, qp, "FacturaSs"), dsPDV1);

            if (dsPDV1.TDA_V_FACTURAS.Rows.Count > 0)
            {
                #region Obteniendo detalles del producto

                qp.Clear();
                qp.AddReplaceParam("DOCUMENTO", dsPDV1.TDA_V_FACTURAS[0].DOCUMENTO.ToString());
                dsPDV1.TDA_DETALLE_PEDIDO.Clear();
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_DETALLE_PEDIDO.TableName, qp), dsPDV1);
                #endregion
            }

            return (dsPDV1.TDA_V_FACTURAS.Rows.Count > 0);
        }
        #endregion

        #region btnConsultar_Click
        private void btnConsultar_Click(object sender, EventArgs e)
        {
            GetInvoiceData(Utils.Helpers.ObjToStr(merFactura.PropertiesCollection[0].Value), Utils.Helpers.ObjToStr(merFactura.PropertiesCollection[1].Value));
        }
        #endregion

        #region txtFactura_KeyDown
        private void txtFactura_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                GetInvoiceData(Utils.Helpers.ObjToStr(merFactura.PropertiesCollection[0].Value), Utils.Helpers.ObjToStr(merFactura.PropertiesCollection[1].Value));
            }
        }
        #endregion

        #region GetInvoiceData
        private void GetInvoiceData(string serie, string factura)
        {
            if (FindFactura(serie, factura))
            {
                rowCliente.Properties.Value = dsPDV1.TDA_V_FACTURAS[0]["NOMBRE"];
                rowNit.Properties.Value = dsPDV1.TDA_V_FACTURAS[0]["NIT"];
                rowTotal.Properties.Value = dsPDV1.TDA_V_FACTURAS[0]["TOTAL"];
                rowBodega.Properties.Value = dsPDV1.TDA_V_FACTURAS[0]["NOMBRE_BODEGA"];
                merFactura.PropertiesCollection[1].Value = dsPDV1.TDA_V_FACTURAS[0]["NO_DOCUMENTO"];
                Documento = dsPDV1.TDA_V_FACTURAS[0]["DOCUMENTO"].ToString();
            }
            else
            {
                rowCliente.Properties.Value = null;
                rowNit.Properties.Value = null;
                rowTotal.Properties.Value = null;
                rowBodega.Properties.Value = null;
                Documento = null;
                dsPDV1.TDA_V_FACTURAS.Clear();
                dsPDV1.TDA_DETALLE_PEDIDO.Clear();
            }
        }
        #endregion

        #region frmConstanciaRegalo_Load
        private void frmConstanciaRegalo_Load(object sender, EventArgs e)
        {
            vGridControl1.FocusedRow = merFactura;
            vGridControl1.Focus();
        }
        #endregion

        #region printInvoice
        /// <summary>
        /// Imprime la factura
        /// </summary>
        /// <param name="documento"></param>
        public static void printInvoice(long documento)
        {
            int Formato = 2;
            int numImpresiones = 1;
            object FormatoTipoImpresion = null;
            // int EsCredito = 0;
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'CR");

            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
            Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

            RegistryKey key = Registry.CurrentUser; // GUSTAVO MIRANDA
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
            if (key != null)
            {
                if (Convert.ToString(key.GetValue("FormatoImpresion", null)) != "")
                {
                    Formato = Convert.ToInt16(key.GetValue("FormatoImpresion", 2));
                }
            }

            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");
                }
            }
            if (Formato != 1)
            {
                if (Formato != 0)
                {
                    Formato = Convert.ToInt16(dsDocTienda.DOMAINS[0]["RV_MPNC03"]);
                }
            }

            RegistryKey Printer = Registry.CurrentUser;
            Printer = Printer.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

            string printerFactura = "";

            if (Printer != null)
                printerFactura = Helpers.ObjToStr(Printer.GetValue("Factura", ""));
            if (printerFactura == "")
                printerFactura = dsDocTienda.DOMAINS[0].RV_MPCC00;
            for (int i = 0; i < numImpresiones; i++)
            {
                imprimirDocumentoPreimpresaDOS(documento, printerFactura, dsDocTienda.DOMAINS[0].RV_MPCC03, Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString(), "", "");
                if (numImpresiones > 1)
                {
                    Thread.Sleep(4000);  // SE DEJA ESTE TIEMPO PARA QUE NO SE LEA EL TXT ADECUADO
                }
            }
        }
        #endregion

        #region imprimirDocumentoPreimpresaDOS
        private static void imprimirDocumentoPreimpresaDOS(long documento, string Impresora, string codigoReporte, string formato, string batName, string prefijo)
        {           
            string PreimpresaXvariables = Helpers.ObjToStr(CApp.GetParam("PIXV"));

            if (PreimpresaXvariables == "NO")
            {
                Hashtable ht = new Hashtable();
                QueryParams QueryParams = new QueryParams();
                QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
                ht.Add("TDA_V_REP_DOCUMENTOS", QueryParams);
                ht.Add("TDA_V_REP_DET_DOCUMENTOS", QueryParams);

                LLNet.Reports.BaseReports.XRInfo Info;
                Info = Reports.BaseReports.XRBase.SetInfo(codigoReporte);

                RegistryKey key = Registry.CurrentUser;
                key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                string printerFactura = "";

                if (key != null)
                    printerFactura = Helpers.ObjToStr(key.GetValue("Factura", ""));


                if (printerFactura != string.Empty)
                    Info.PrinterName = printerFactura;

                LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
                xrBase.Parametros = Info;
                xrBase.BllInstance = CApp.bll;
                xrBase.ExePath = CApp.ExeDir;

                xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
            }
            else
            {
                QueryParams qp = new QueryParams();

                qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'FAP");

                Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

                if (dsDocTienda.DOMAINS.Count > 0)
                {

                    imprimirDocumentoDOS(documento, Impresora, Convert.ToInt32(formato), prefijo, batName);
                }
            }
        }
        #endregion

        #region imprimirDocumentoDOS
        private static void imprimirDocumentoDOS(long documento, string Impresora, long formato, string prefijo, string BatName)
        {
            if (BatName == "")
                BatName = "imprimir.bat";
            string Ruta = Application.StartupPath;
            QueryParams qp = new QueryParams();
            if (Ruta != string.Empty)
            {
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(Ruta + "\\" + BatName);
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                string Args = "";

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

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

                try
                {
                    qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                    qp.AddReplaceParam("FORMATO", formato.ToString());
                    qp.AddReplaceParam("USUARIO", CApp.usuario.ToString());
                    CApp.bll.ExecuteSql("GENERAR_IMPRESION_POS", qp, "PDV");
                    Thread.Sleep(3000); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                    System.Diagnostics.Process.Start(startInfo);
                }
                catch (Exception ex)
                {
                    CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
                }
            }
            else
            {
                throw new Exception("No esta Definido el Parametro UATI");
            }
        }
        #endregion

        #region btnAceptar_Click
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (Documento != String.Empty && Documento != null)
            {
                printInvoice(long.Parse(Documento));

                DialogResult = DialogResult.OK;
            }
        }
        #endregion
    }
}