using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace LLNet.Tienda.MainForms.Controls
{
    public partial class ctlPagosAnticipados : UserControl
    {
        #region Declaracion de Eventos

        public event System.ComponentModel.CancelEventHandler BeforePayWithPrepaid;
        public event System.EventHandler PayWithPrepaid;

        #endregion

        public decimal? OriginalValue;
        
        public ctlPagosAnticipados()
        {
            InitializeComponent();

            GUI.CApp.TraducirForm(this);
        }

        private decimal cliente;

        public void Init(object[] pArgs)
        {
            Forms.frmPayments payment = ((Forms.frmPayments)FindForm());
            dsPDV1 = payment.DsVale;

            gridControl1.DataSource = dsPDV1;
            gridControl1.DataMember = dsPDV1.TDA_V_PAGOS_ANTICIPADOS.TableName;

            if (pArgs != null)
                cliente = Convert.ToDecimal(pArgs[0]);
 
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("SOCIO", Utils.Helpers.ObjToStr(cliente));
            if (dsPDV1.TDA_V_PAGOS_ANTICIPADOS.Count == 0)
            {
                dsPDV1.TDA_V_PAGOS_ANTICIPADOS.Clear();
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_PAGOS_ANTICIPADOS.TableName, qp), dsPDV1);
            }

            decimal total = 0;
            foreach (Model.PDV.DsPDV.TDA_V_PAGOS_ANTICIPADOSRow row in dsPDV1.TDA_V_PAGOS_ANTICIPADOS)
            {
                total += row.SALDO;
            }

            if (OriginalValue > total)
            {
                OriginalValue = total;
                rowMONTO.Properties.Value = OriginalValue;
            }
        }

        private void ctlPagosAnticipados_Load(object sender, EventArgs e)
        {
            gridView1.BestFitColumns();
        }

        public void AgregarPago(object sender, decimal pCurrencyValue)
        {
            // Ejecuta el evento antes del pago en efectivo si se ha creado
            CancelEventArgs cea = new CancelEventArgs();
            if (BeforePayWithPrepaid != null)
                BeforePayWithPrepaid(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("El monto a abonar debe ser mayor a cero", "Pagos Anticipados", true);
                rowMONTO.Properties.Value = OriginalValue;
                Vgc.FocusedRow = rowMONTO;
                return;
            }

            if (Math.Round(pCurrencyValue,2) > Math.Round((decimal)OriginalValue,2))
            {
                GUI.CApp.ShowMessage("El monto a abonar no puede ser mayor al total de la factura o al total de pagos anticipados", "Pagos Anticipados", true);
                rowMONTO.Properties.Value = OriginalValue;
                Vgc.FocusedRow = rowMONTO;
                return;
            }

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

            // Paga en efectivo
            Prepaid(pValue, pPay, 1, null, pCurrencyValue);

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

        }

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

            Model.PDV.DsPDV.PAGO_ANTICIPADORow paRow = payment.DsRecibo.PAGO_ANTICIPADO.NewPAGO_ANTICIPADORow();
            if (payment.DsFactura.WMS_DOCUMENTOS.Count == 0)
            {
                payment.CreateInvoice();
            }

            paRow.FACTURA = payment.DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
            paRow.MONTO = pValue;
            paRow.SOCIO = payment.DsPedido.WMS_SOCIOS[0].SOCIO;
            payment.DsRecibo.PAGO_ANTICIPADO.AddPAGO_ANTICIPADORow(paRow);

            decimal pSaldo = pValue;

            foreach (Model.PDV.DsPDV.TDA_V_PAGOS_ANTICIPADOSRow par in dsPDV1.TDA_V_PAGOS_ANTICIPADOS)
            {
                if (pSaldo > 0)
                {
                    par.BeginEdit();
                    if (par.SALDO > pSaldo)
                    {
                        par.SALDO -= pSaldo;
                        pSaldo = 0;
                    }
                    else
                    {
                        pSaldo -= par.SALDO;
                        par.SALDO = 0;
                    }
                    par.EndEdit();
                    par.AcceptChanges();
                }
                else
                    break;
            }

            dsPDV1.TDA_V_PAGOS_ANTICIPADOS.AcceptChanges();

            gridView1.RefreshData();
            gridView1.UpdateTotalSummary();

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

            /*
            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 = 3;
            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 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(((DevExpress.XtraEditors.TextEdit)sender).EditValue));

        }
    }
}