using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LLNet.Utils;
using LLNet.GUI;
using DevExpress.XtraEditors;

namespace LLNet.Tienda.MainForms.Controls
{
    public partial class ctlZunify : UserControl
    {
        public event System.EventHandler PayWithZunify;
        public event System.ComponentModel.CancelEventHandler BeforePayWithZunify;

        public decimal? OriginalValue;
        public decimal Rate = 1;
        public decimal? Currency;
        public string DOC_PEDIDO;


        public ctlZunify()
        {
            InitializeComponent();
            if (!DesignMode)
            {
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_MONEDAS.TableName), dsPDV1);
                
            }

            GUI.CApp.TraducirForm(this);
        }

        public ctlZunify(string p_doc)
        {
            InitializeComponent();
            if (!DesignMode)
            {
                DOC_PEDIDO = p_doc;
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_MONEDAS.TableName), dsPDV1);
                
            }

            GUI.CApp.TraducirForm(this);
        }
        #region Procedimientos y funciones del controles

        public void RecalcularMonto()
        {
            rowMONTO.Properties.Value = OriginalValue / Rate;
            Vgc.FocusedRow = rowMONTO;
            Vgc.ShowEditor();
        }

        private void ctlZunify_Load(object sender, EventArgs e)
        {
            if (DOC_PEDIDO != string.Empty)
            {

                // Cantidad de artículos de membresia plus
                Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                qp3.AddReplaceParam("P_DOCUMENTO", DOC_PEDIDO);

                string cantMembrPlus = (GUI.CApp.bll.GetSingleValue("PLUSCARTPEDIDO", qp3, "PDV").ToString());
                if (cantMembrPlus != "0")
                { //carga los tipos de cambio para la membresia ekono Plus
                    dsPDV1.TDA_V_MONEDAS.Clear(); //Borra el DataT
                    Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_MONEDAS.TableName, "TDA_V_MONEDASCLUB"), dsPDV1);
                }
                else
                {
                    dsPDV1.TDA_V_MONEDAS.Clear(); //Borra el DataT
                    Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_MONEDAS.TableName, "DsPDV.TDA_V_MONEDAS"), dsPDV1);
                }

            }
            // Coloca el foco en la fila de Pago en Zunify
            Vgc.FocusedRow = rowMONTO;
        }
        private void ctlZunify_Enter(object sender, EventArgs e)
        {
        }
        private void txtMonto_KeyDown(object sender, KeyEventArgs e)
        {
            // Si el usuario presiono la tecla ENTER efectua el proceso de pago
            if (e.KeyCode == Keys.Enter)
            {
                //AgregarPago(sender, Convert.ToDecimal(((TextEdit)sender).EditValue));
            }
        }

        private void lueMoneda_Enter(object sender, EventArgs e)
        {
            DevExpress.XtraEditors.LookUpEdit lue = ((DevExpress.XtraEditors.LookUpEdit)sender);

        }
        private void lueMoneda_Leave(object sender, EventArgs e)
        {
            Rate = decimal.Parse(((LookUpEdit)sender).GetColumnValue("FACTOR").ToString());
            Currency = decimal.Parse(((LookUpEdit)sender).GetColumnValue("MONEDA").ToString());

            RecalcularMonto();



        }
        private void lueMoneda_EditValueChanged(object sender, EventArgs e)
        {
            //    Rate = decimal.Parse(((LookUpEdit)sender).GetColumnValue("FACTOR").ToString());
            //    Currency = decimal.Parse(((LookUpEdit)sender).GetColumnValue("MONEDA").ToString());

            //    RecalcularMonto();
            //
        }
        private void lueMoneda_Popup(object sender, EventArgs e)
        {

        }
        private void lueMoneda_Closed(object sender, DevExpress.XtraEditors.Controls.ClosedEventArgs e)
        {
        }

        private void calcZunify_KeyDown(object sender, KeyEventArgs e)
        {
        }
        private void calcZunify_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
        }
        private void Vgc_Click(object sender, EventArgs e)
        {
        }
        private void Vgc_FocusedRecordCellChanged(object sender, DevExpress.XtraVerticalGrid.Events.IndexChangedEventArgs e)
        {
            Vgc.ShowEditor();
        }
        public void AgregarPago(object sender, decimal pCurrencyValue)
        {
            // Ejecuta el evento antes del pago en Zunify si se ha creado
            CancelEventArgs cea = new CancelEventArgs();
            if (BeforePayWithZunify != null)
                BeforePayWithZunify(sender, cea);
            
            // Detiene el proceso de pago en Zunify si se ha cancelado desde el evento
            if (cea.Cancel == true)
                return;
            
            if (pCurrencyValue == 0)
            {
                GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("El monto a abonar debe ser mayor a cero"), catZunify.Properties.Caption.ToString(), false);
                Vgc.FocusedRow = rowMONTO;
                return;
            }

            // Obtiene los valores de pago
            decimal pValue = (OriginalValue < pCurrencyValue * Rate) ? (decimal)OriginalValue : pCurrencyValue * Rate;
            decimal pPay = pCurrencyValue * Rate;

            // Paga con Zunify
            Zunify(pValue, pPay, Rate, Currency, pCurrencyValue);
            
            // Ejecuta el evento despues del pago con Zunify
            if (PayWithZunify != null)
                PayWithZunify(sender, null);


        }

        public void Zunify(decimal pValue, decimal pPay, decimal pRate, decimal? pCurrency, decimal pCurrencyValue)
        {

            Forms.frmPayments payment = ((Forms.frmPayments)FindForm());

            if (payment.beforePay(pValue) == -1) return;

            Model.PDV.DsPDV.WMS_PAGO_DOCUMENTOSRow pdr = payment.DsRecibo.WMS_PAGO_DOCUMENTOS.NewWMS_PAGO_DOCUMENTOSRow();
            // TODO: Cambiar la forma como obtiene el recibo
            pdr.DOCUMENTO = payment.DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO;
            pdr.TIPO_PAGO = 40;
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("DOCUMENTO", (payment.DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO).ToString());
            pdr.LINEA = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("SiguienteLineaPago", qp, "PDV")) + payment.DsRecibo.WMS_PAGO_DOCUMENTOS.Rows.Count;
            pdr.VALOR = pValue;
            pdr.PAGADO = pPay;
            pdr.TASA_CAMBIO = pRate;
            if (pCurrency != null)
                pdr.MONEDA = (decimal)pCurrency;

            pdr.VALOR_MONEDA = pCurrencyValue;
            pdr.FECHA = DateTime.Now;
            

            payment.DsRecibo.WMS_PAGO_DOCUMENTOS.AddWMS_PAGO_DOCUMENTOSRow(pdr);
        }

        private string FmtMonto(decimal pmonto)
        {
            decimal mont = decimal.Round(pmonto, 2); //redondea a 2 decimales
            return FmtMonto(mont);
        }

        private string FmtMonto(string pmonto)
        {
            string monto = string.Empty;
            Int32 punto = pmonto.LastIndexOf('.');
            Int32 lngtd = pmonto.Length;
            Int32 cdec = lngtd - punto;
            if (punto == -1)
            {//no trae punto    
                monto = pmonto.ToString() + "00";
            }
            else
            {
                if (lngtd == 1)
                {//punto al final
                    monto = pmonto.ToString().Remove(punto, 1) + "00";
                }
                else
                {
                    if (lngtd == 2)
                    {//punto x.x    
                        monto = pmonto.ToString().Remove(punto, 1) + "0";
                    }
                    else
                    {
                        if (lngtd == 3)
                        {//punto x.x    
                            monto = pmonto.ToString().Remove(punto, 1);
                        }
                    }
                }
            }
            return monto;
        }


        #endregion

        private void vGridControl1_FocusedRecordCellChanged(object sender, DevExpress.XtraVerticalGrid.Events.IndexChangedEventArgs e)
        {
            Vgc.ShowEditor();
        }
        private void textEdit1_EditValueChanged(object sender, EventArgs e)
        {
        }
        private void popupContainerControl1_Enter(object sender, EventArgs e)
        {
        }

       
         
    }
}
