#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
{
    public partial class ctlGiftCard : UserControl
    {
        #region Declaracion de Eventos

        public event System.ComponentModel.CancelEventHandler BeforePayWithGiftCard;
        public event System.EventHandler PayWithGiftCard;


        #endregion

        public decimal? OriginalValue;

        public decimal Rate = 1;

        public decimal? Currency;

        public ctlGiftCard()
        {
            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);
        }

        #region Eventos

        private void ctlGiftCard_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 pMonto, string ptarjeta)
        {
            // Ejecuta el evento antes del pago en efectivo si se ha creado
            CancelEventArgs cea = new CancelEventArgs();
            if (BeforePayWithGiftCard != null)
                BeforePayWithGiftCard(sender, cea);

            // Detiene el proceso de pago en efectivo 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"), catGiftCard.Properties.Caption.ToString(), false);
                Vgc.FocusedRow = rowMONTO;
                return;
            }
            //Valida si tiene el saldo suficiente para pagar con la GiftCard
            if (pCurrencyValue > pMonto)
            {
                GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("El monto a abonar Supera el Saldo de la Tarjeta Disponibles, Saldo: " + pMonto), catGiftCard.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 GiftCard
            GiftCard(pValue, pPay, Rate, Currency, pCurrencyValue, ptarjeta);

            // Ejecuta el evento despues del pago con giftcar
            if (PayWithGiftCard != null)
                PayWithGiftCard(sender, null);

        }

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

        #region Pago con GiftCard

        /// <summary>
        /// Pago con GiftCard
        /// </summary>
        public void GiftCard(decimal pValue, decimal pPay, decimal pRate, decimal? pCurrency, decimal pCurrencyValue, string ptarjeta)
        {
            Forms.frmPayments payment = ((Forms.frmPayments)FindForm());
            Boolean vpago = false;
            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 = 14;
                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);
               
               //Echo por Richard Vargas Martinez 07/06/2019
               /*Se valida que no haya dos formas de pago GIFTCARD en una factura 
                  
               foreach (DataRow row in payment.DsRecibo.WMS_PAGO_DOCUMENTOS)
                    {
                        if (row["TIPO_PAGO"].ToString() == "14")
                        {
                            vpago = true;
                        }
                    }

                    if (vpago == false)
                    {
                        payment.DsRecibo.WMS_PAGO_DOCUMENTOS.AddWMS_PAGO_DOCUMENTOSRow(pdr);
                    }
                    else
                    {
                        GUI.CApp.ShowMessage("No puede agregar el pago GIFTCARD ya que posee uno", "Atención", false);
                    }
                
                //Fin Richard Vargas Martinez 
                * */
            //}
            //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),);
        }

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

        }


    }
}
