#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;
using LLNet.GUI;
#endregion

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

        public event System.ComponentModel.CancelEventHandler BeforePayWithCash;
        public event System.EventHandler PayWithCash;

        #endregion

        public decimal? OriginalValue;

        public decimal Rate = 1;

        public decimal? Currency;

        public string DOC_PEDIDO;

        #region Constructor

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

                /*
                // Cantidad de artículos de membresia plus
                Forms.frmPayments payment = ((Forms.frmPayments)FindForm());
                Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                qp3.AddReplaceParam("P_DOCUMENTO", (payment.DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO).ToString());
              
                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);
                }
                 */
                rowMoneda.Properties.Value = GUI.CApp.bll.GetSingleValue("MonedaBase", "General");                
            }

            GUI.CApp.TraducirForm(this);
        }

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

                rowMoneda.Properties.Value = GUI.CApp.bll.GetSingleValue("MonedaBase", "General");
            }

            GUI.CApp.TraducirForm(this);
        }

        #endregion

        #region Eventos

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

                // Cantidad de artículos de membresia plus
                //Forms.frmPayments payment = ((Forms.frmPayments)FindForm());
                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);
                    rowMoneda.Properties.Value = GUI.CApp.bll.GetSingleValue("MonedaBase", "General");
                }
                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);
                    rowMoneda.Properties.Value = GUI.CApp.bll.GetSingleValue("MonedaBase", "General");
                }
                
            }

            // Coloca el foco en la fila de Pago en Efectivo
            Vgc.FocusedRow = rowMONTO;
        }

        public void AgregarPago(object sender, decimal pCurrencyValue)
        {
            bool vContinuar = false;

            if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0)
            {
                Utils.QueryParams vParametros = new Utils.QueryParams();
                vParametros.AddReplaceParam("pMONEDA", Currency.ToString());
                vParametros.AddReplaceParam("pSOCIO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
                //
                string vResultado = CApp.bll.GetSingleValue("POS_F_VALIDA_EFECTIVO", vParametros, "PDV").ToString();

                if (vResultado == "0")
                {
                    GUI.CApp.ShowMessage("No se permite el pago con esta moneda para este socio", "", true);
                }
                else
                {
                    vContinuar = true;
                }
            }
            else
            {
                vContinuar = true;
            }

            if (vContinuar)
            {
                // Ejecuta el evento antes del pago en efectivo si se ha creado
                CancelEventArgs cea = new CancelEventArgs();
                if (BeforePayWithCash != null)
                    BeforePayWithCash(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"), catCash.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
                Cash(pValue, pPay, Rate, Currency, pCurrencyValue);

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

        }

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

        #region Pago en Efectivo

        /// <summary>
        /// Pago en Efectivo
        /// </summary>
        public void Cash(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 = 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);            
        }

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

        }
    }
}