#region using statements
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
#endregion

namespace LLNet.Tienda.MainForms.Controls
{
    /// <summary>
    /// Control para el Pago de Efectivo
    /// </summary>
    public partial class ctlPoints : UserControl
    {
        #region Declaracion de Eventos

        public event System.ComponentModel.CancelEventHandler BeforePayWithPoints;
        public event System.EventHandler PayWithPoints;
       

        #endregion

        public decimal? OriginalValue;

        public decimal Rate = 1;

        public decimal? Currency;

        #region Constructor

        public ctlPoints()
        {
            InitializeComponent();
            if (!DesignMode)
            {
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_MONEDAS.TableName), dsPDV1);
                rowMoneda.Properties.Value = GUI.CApp.bll.GetSingleValue("MonedaBase", "General");
                
            }

            GUI.CApp.TraducirForm(this);
        }

        #endregion

        #region Eventos

        private void ctlCash_Load(object sender, EventArgs e)
        {
            // Coloca el foco en la fila de Pago en Efectivo
            Vgc.FocusedRow = rowMONTO;

        }

        public void AgregarPago(object sender, decimal pCurrencyValue,decimal pPuntos,string ptarjeta)
        {
            // Ejecuta el evento antes del pago en efectivo si se ha creado
            CancelEventArgs cea = new CancelEventArgs();
            if (BeforePayWithPoints != null)
                BeforePayWithPoints(sender, cea);

            // Detiene el proceso de pago en efectivo si se ha cancelado desde el evento
            if (cea.Cancel == true)
                return;

            //valida la cantidad de puntos por el factor
            decimal ValFactPts = decimal.Parse(GUI.CApp.bll.GetSingleValue("C_Factor", "PDV").ToString());
            decimal ValRealPts = pCurrencyValue * ValFactPts;

            if (pCurrencyValue == 0)
            {
                GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("El monto a abonar debe ser mayor a cero"), catPoints.Properties.Caption.ToString(),false);
                Vgc.FocusedRow = rowMONTO;
                return;
            }
            if (ValRealPts > pPuntos)//if (pCurrencyValue > pPuntos)
            {
                GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("El monto a abonar Supera el Saldo de Puntos Disponibles"), catPoints.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 en efectivo
            Points(pValue, pPay, Rate, Currency, pCurrencyValue, ptarjeta );

            // Ejecuta el evento despues del pago en efectivo
            if (PayWithPoints != null)
                PayWithPoints(sender, null);

        }

        private void calcCash_KeyDown(object sender, KeyEventArgs e)
        {
        }

        #region Pago en Efectivo

        /// <summary>
        /// Pago en Efectivo
        /// </summary>
        public void Points(decimal pValue, decimal pPay, decimal pRate, decimal? pCurrency, decimal pCurrencyValue, string ptarjeta)
        {
            Forms.frmPayments payment = ((Forms.frmPayments)FindForm());

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

                        
            //*****valida otra tarjeta
            bool vpagotarj = true;
            
            Model.PDV.DsPDV.WMS_PAGO_DOCUMENTOSDataTable tpagos = payment.DsRecibo.WMS_PAGO_DOCUMENTOS;
            foreach (DataRow fil in payment.DsRecibo.WMS_PAGO_DOCUMENTOS)
            {
                string t_pag = fil[2].ToString();
                if(t_pag == "16")                
                    vpagotarj = false;
            }
            if (vpagotarj)
            {
                //*****fin valida otra tarjeta

                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 = 16;
                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;
                pdr.TARJETA = ptarjeta;
                if (pCurrency != null)
                    pdr.MONEDA = (decimal)pCurrency;

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

                payment.DsRecibo.WMS_PAGO_DOCUMENTOS.AddWMS_PAGO_DOCUMENTOSRow(pdr);
            }
            else
            {
                GUI.CApp.ShowMessage("No puede agregar el pago ya que tienes otro pago con puntos","Atención",false);
                Vgc.FocusedRow = rowMONTO;
                return;
            }
        }

        #endregion

        #endregion

        private void Vgc_Click(object sender, EventArgs e)
        {
        }

        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();
        //
        }

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

        private void ctlCash_Enter(object sender, EventArgs e)
        {
        }

        private void textEdit1_EditValueChanged(object sender, EventArgs e)
        {            
        }

        private void popupContainerControl1_Enter(object sender, EventArgs e)
        {
        }

        private void calcCash_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
        }

        private void lueMoneda_Closed(object sender, DevExpress.XtraEditors.Controls.ClosedEventArgs 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), Convert.ToDecimal(rowSaldo.Properties.Value), );*/
        }

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

        private void Vgc_FocusedRecordCellChanged(object sender, DevExpress.XtraVerticalGrid.Events.IndexChangedEventArgs e)
        {
            Vgc.ShowEditor();
        }

        private void lueMoneda_Enter(object sender, EventArgs e)
        {
            DevExpress.XtraEditors.LookUpEdit lue = ((DevExpress.XtraEditors.LookUpEdit)sender);
            rowMoneda.Properties.Value = lue.EditValue;
        }

        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();

        }
    }
}