#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
{
    /*************************DLQG***********************************/
    /// <summary>
    /// Control de Pago con Credicuotas Ekono
    /// </summary>
    public partial class ctlCredicuotsEk : UserControl
    {
        #region Declaracion de Eventos

        public event System.ComponentModel.CancelEventHandler BeforePayWithCredicuotasEk;
        public event System.EventHandler PayWithCredicuotasEk;

        #endregion

        public decimal? OriginalValue;

        public decimal Rate = 1;

        public decimal? Currency;

        public string ref_sec;

        public ctlCredicuotsEk()
        {
            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 ctlCredicuotsEk_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)
        {
            Forms.frmPayments payment2 = ((Forms.frmPayments)FindForm());

            foreach (DataRow fil in payment2.DsRecibo.WMS_PAGO_DOCUMENTOS)
            {
                //string t_pag = fil[2].ToString();
                if (fil[2].ToString() == "34")
                {//si es tipo de Pago GiftCard
                    GUI.CApp.ShowMessage("Ya tienes un pago con CrediCuotas agregado", "CrediCuotas Ekono", false);
                    return;
                }
            }

            // Ejecuta el evento antes del pago en efectivo si se ha creado
            CancelEventArgs cea = new CancelEventArgs();
            if (BeforePayWithCredicuotasEk != null)
                BeforePayWithCredicuotasEk(sender, cea);

            // Detiene el proceso de pago con monedero aló 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"), catCrediCuotasEk.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;


            decimal mont = decimal.Round(pCurrencyValue, 2); //redondea a 2 decimales
            //payment.DsRecibo.WMS_PAGO_DOCUMENTOS
            
            string documento ;

            //if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0)
            //{
            //    documento = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
            //}
            //else
            //{
            //    documento = payment2.DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
            //}

            if (payment2.DsPedido.WMS_DOCUMENTOS.Count > 0)
            {
                documento = payment2.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
            }
            else
            {
                documento = payment2.DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
            }

            //Formulario de CrediCuotas Ekono
            LLNet.Tienda.MainForms.Forms.CreditEko.FrmCrediCuotsEk frmCCE = new LLNet.Tienda.MainForms.Forms.CreditEko.FrmCrediCuotsEk(mont.ToString());
            frmCCE.ShowDialog();

            // Detiene el proceso de pago con monedero Alo si no tuvo respuesta positiva o se cancelo dsd el form
            if (frmCCE.exito == false)
                return;

            //ALMACENA EN UNA VARIABLE LA SECUENCIA DE REFERENCIA DEL PAGO PREAPROBADO
            ref_sec = frmCCE.refer;

            // Paga con credicuotasekono
            CrediCuotasEk(pValue, pPay, Rate, Currency, pCurrencyValue);

            // Ejecuta el evento despues del pago con cREDICUOTAS EKONO
            if (PayWithCredicuotasEk != null)
                PayWithCredicuotasEk(sender, null);
        }

        #region Pago con Credicuotas Ekono

        /// <summary>
        /// Pago con Credicuotas Ekono
        /// </summary>
        public void CrediCuotasEk(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 = 34;
            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;
            //pdr.EMISOR = 4;
            //pdr.TARJETA =             

            payment.DsRecibo.WMS_PAGO_DOCUMENTOS.AddWMS_PAGO_DOCUMENTOSRow(pdr);

            //Deshabilitar el boton Cancelar para obligar el pago
            //payment.btnCancelar.Enabled = false;
        }

        #endregion

        #endregion

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

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