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;

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

        public event System.ComponentModel.CancelEventHandler BeforePayWithNote;
        public event System.EventHandler PayWithNote;

        #endregion

        public decimal? OriginalValue;

        public decimal Rate = 1;

        public decimal? Currency;

        private decimal? valorOriginalVale;

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

            GUI.CApp.TraducirForm(this);
          }

        private void ctlValeTercero_Load(object sender, EventArgs e)
        {
            categoryRow1.Properties.Caption = ((Forms.frmPayments)FindForm()).btnVale.Text.Substring(12).Trim();
            Vgc.FocusedRow = rowVALE;
        }

        private void txtVale_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter && Utils.Helpers.ObjToStr(((TextEdit)sender).EditValue).Trim() != string.Empty )
                buscarVale(((TextEdit)sender).EditValue );
        }

        private string tipoVale;

        private void buscarVale(object pVale)
        { 
            Forms.frmPayments payment = ((Forms.frmPayments)FindForm());

            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("VALE", pVale.ToString());

           try
            {
            qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.Order.ToString());
             }
            catch // SI DA ERROR ES PQ ES UN VALE PARA UNA FACTURA DE CREDITO
             {
                 GUI.CApp.ShowMessage("No se puede aplicar vales a Facturas de Crédito", "Vales y Certificados de Regalo", true);
                 return;
            }            

            payment.DsVale.DOC_VALES.Clear();
            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(payment.DsVale.GetType(), payment.DsVale.DOC_VALES.TableName, qp, "FillByValeExceptOrder"), payment.DsVale);

            tipoVale = string.Empty;

            if (payment.DsVale.DOC_VALES.Rows.Count > 0)
            {
                if (payment.DsRecibo.WMS_PAGO_DOCUMENTOS.Select("vale = " + pVale.ToString()).Length > 0)
                {
                    GUI.CApp.ShowMessage("El vale ya fue canjeado", "Vales y Certificados de Regalo", true);
                    return;
                }

                Model.PDV.DsPDV.DOC_VALESRow dvr = payment.DsVale.DOC_VALES[0];

                if (dvr.VENCE_EL < DateTime.Today)
                {
                    GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("La fecha de vencimiento del vale/certificado de regalo fue el ") + dvr.VENCE_EL.ToShortDateString(), GUI.CApp.TraducirPalabra("Vales y Certificados de Regalo"),false);
                    return;
                }

                tipoVale = dvr.TIPO;

                decimal vPrecio = dvr.MONTO;
                valorOriginalVale = vPrecio;

                if (dvr["SKU"] != DBNull.Value)
                {
                    rowMONTO.Properties.ReadOnly = true;
                    Utils.QueryParams qpSku = new LLNet.Utils.QueryParams();
                    qpSku.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.Order.ToString());
                    qpSku.AddReplaceParam("SKU", dvr.SKU.ToString());

                    int isInDocument = Convert.ToInt32(GUI.CApp.bll.GetSingleValue("ExisteSkuEnDocumento", qpSku, "PDV"));
                    if (isInDocument > 0)
                    {
                        vPrecio = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("PrecioSkuEnDocumento", qpSku, "PDV"));
                        valorOriginalVale = vPrecio;
                    }
                    else
                    {
                        GUI.CApp.ShowMessage("El producto del certificado de regalo no existe dentro del pedido", "Vales y Certificados de Regalo", true);
                        return;
                    }
                }
                else
                {
                    rowMONTO.Properties.ReadOnly = false;
                    if (vPrecio > OriginalValue)
                        vPrecio = (decimal)OriginalValue;
                    Vgc.FocusedRow = rowMONTO;

                }

                rowMONTO.Properties.Value = vPrecio;
                rowVALE.Properties.Value = pVale;
                payment.DsVale.DOC_VALES[0].ESTADO = "E";
                //payment.DsFactura.WMS_SKUS_X_DOCUMENTO[0].VALE = Convert.ToDecimal(pVale);             
            }
            else
                GUI.CApp.ShowMessage("El vale no existe o ya fue canjeado", "Vales y Certificados de Regalo", true);
            
        }

        public void AgregarPago(object pMonto)
        {
            if (pMonto == null || pMonto == DBNull.Value || Utils.Helpers.ObjToStr(pMonto) == string.Empty)
            {
                GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("Ingrese número de vale"), categoryRow1.Properties.Caption.ToString(),false);
                Vgc.FocusedRow = rowVALE;
                return;
            }

            if (Convert.ToDecimal(pMonto) > valorOriginalVale)
            {
                GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("El monto a canjear no puede ser mayor al monto del vale"), categoryRow1.Properties.Caption.ToString(),false);                
                Vgc.FocusedRow = rowMONTO;
                return;
            }

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

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

            decimal pCurrencyValue = Convert.ToDecimal(pMonto);

            if (pCurrencyValue == 0)
            {
                GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("El monto a abonar debe ser mayor a cero"), categoryRow1.Properties.Caption.ToString(),false);
                Vgc.FocusedRow = rowVALE;
                return;
            }

            // Obtiene los valores de pago
            decimal pValue = (OriginalValue < pCurrencyValue * Rate) ? (decimal)OriginalValue : pCurrencyValue * Rate;
            decimal pPay = pCurrencyValue * Rate;
            decimal pSaldo = Math.Round((decimal)valorOriginalVale - pValue,2);

            // Paga en efectivo
            Pagar(pValue, pPay, Rate, Currency, pCurrencyValue, Utils.Helpers.ObjToStr(rowVALE.Properties.Value),pSaldo);

            // Ejecuta el evento despues del pago en efectivo empresa
            if (PayWithNote != null)
                PayWithNote(pPay, null);

        }

        #region Pago en Efectivo Empresa

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

            if (pSaldo > 0)
            {
                Dialogs.Refunds.dlgGiftCard gc = new LLNet.Tienda.Dialogs.Refunds.dlgGiftCard();
                gc.Init(new object[] { pSaldo, pVale, tipoVale });
                gc.ShowDialog();
                if (gc.DialogResult != DialogResult.OK)
                    return;
                else
                    payment.ValesGenerados.Add((decimal)gc.ValeGenerado);
            }

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

            if (payment.DsVale.DOC_VALES.Count > 0 && payment.DsFactura.WMS_DOCUMENTOS.Count > 0)
            {
                payment.DsVale.DOC_VALES[0].FACTURA_COBRO = payment.DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
                payment.DsVale.DOC_VALES[0].MODIFICADO_POR = GUI.CApp.usuario;
                payment.DsVale.DOC_VALES[0].ESTADO = "C";

                Model.PDV.DsPDV.WMS_PAGO_DOCUMENTOSRow pdr = payment.DsRecibo.WMS_PAGO_DOCUMENTOS.NewWMS_PAGO_DOCUMENTOSRow();
                pdr.DOCUMENTO = payment.DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO;

                if (payment.DsVale.DOC_VALES[0].TIPO == "A" && Utils.Helpers.Nvl(GUI.CApp.GetParam("GNCC"),"SI").ToString() == "SI")
                {
                    Utils.QueryParams param = new LLNet.Utils.QueryParams();
                    param.AddReplaceParam("pSKU", GUI.CApp.GetParam("SPIC").ToString());
                    pdr.TIPO_PAGO = 24;
                    decimal NotaCredito = Convert.ToDecimal(GUI.CApp.GetSecuence("WMS_S_DOCUMENTO"));
                    Model.PDV.DsPDV.WMS_DOCUMENTOSRow ncEnc = payment.dsNotaCredito.WMS_DOCUMENTOS.NewWMS_DOCUMENTOSRow();
                    ncEnc.DOCUMENTO = NotaCredito;
                    ncEnc.TIPO_DOCUMENTO = "N";
                    ncEnc.DOCUMENTO_PADRE = payment.DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
                    ncEnc.FECHA_EMISION = DateTime.Now;
                    ncEnc.SITUACION = 3;
                    ncEnc.JORNADA = (decimal)Program.Jornada;
                    ncEnc.CAJA = (decimal)Program.Caja;
                    ncEnc.SOCIO = payment.DsFactura.WMS_DOCUMENTOS[0].SOCIO;
                    ncEnc.USUARIO1 = payment.DsFactura.WMS_DOCUMENTOS[0].USUARIO1;
                    ncEnc.CREADO_POR = GUI.CApp.usuario;
                    ncEnc.TOTAL = pValue;
                    payment.dsNotaCredito.WMS_DOCUMENTOS.AddWMS_DOCUMENTOSRow(ncEnc);

                    Model.PDV.DsPDV.WMS_SKUS_X_DOCUMENTORow ncDet = payment.dsNotaCredito.WMS_SKUS_X_DOCUMENTO.NewWMS_SKUS_X_DOCUMENTORow();
                    ncDet.DOCUMENTO = NotaCredito;
                    ncDet.CANTIDAD = 1;
                    ncDet.LINEA = 1;
                    ncDet.CREADO_POR = GUI.CApp.usuario;
                    ncDet.SKU = Convert.ToDecimal(GUI.CApp.GetParam("SPIC"));
                    //ncDet.PRECIO_UNITARIO = pValue / (1 + Convert.ToDecimal(GUI.CApp.GetParam("PIVA")) / 100);
                    ncDet.PRECIO_UNITARIO = pValue / (1 + Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("GetIVA", param, "PDV")) / 100);
                    ncDet.IMPUESTO = pValue - ncDet.PRECIO_UNITARIO;
                    payment.dsNotaCredito.WMS_SKUS_X_DOCUMENTO.AddWMS_SKUS_X_DOCUMENTORow(ncDet);
                }
                else
                    pdr.TIPO_PAGO = 6;

                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.VALE = Convert.ToDecimal(pVale);

                if (pCurrency != null)
                    pdr.MONEDA = (decimal)pCurrency;

                pdr.VALOR_MONEDA = pCurrencyValue;
                pdr.FECHA = DateTime.Now;
                payment.DsRecibo.WMS_PAGO_DOCUMENTOS.AddWMS_PAGO_DOCUMENTOSRow(pdr);
                //Se agrego para cuando se anule un certificado ya cajeado se esta revisando funcionanlidad
                //JDGC 25/01/2010
                //if (payment.DsFactura.WMS_SKUS_X_DOCUMENTO.Count > 0)
                //    payment.DsFactura.WMS_SKUS_X_DOCUMENTO[0].VALE = Convert.ToDecimal(pVale);

                //
            }
            else
            {
                if (payment.DsVale.DOC_VALES.Count == 0)
                    GUI.CApp.ShowMessage("El vale no fue encontrado", "Cobros y Facturación", true);

                if (payment.DsFactura.WMS_DOCUMENTOS.Count == 0)
                    GUI.CApp.ShowMessage("No se pudo generar la factura", "Cobros y Facturación", true);
            }
            
        }

        #endregion

        private void lueMoneda_EditValueChanged(object sender, EventArgs e)
        {
            Rate = decimal.Parse(((LookUpEdit)sender).GetColumnValue("FACTOR").ToString());
            Currency = decimal.Parse(((LookUpEdit)sender).GetColumnValue("MONEDA").ToString());

            rowMONTO.Properties.Value = OriginalValue / Rate;
            Vgc.FocusedRow = rowVALE;
            Vgc.ShowEditor();
            rowMoneda.Properties.Value = Currency;
        }

        private void txtMonto_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                AgregarPago(((DevExpress.XtraEditors.TextEdit)sender).EditValue);
        }

        private void txtVale_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e)
        {
        }

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

        private void Vgc_CellValueChanged(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e)
        {
            if (e.Row.Name == "rowVALE")
            {
                rowMONTO.Properties.ReadOnly = true;
                rowMONTO.Properties.Value = null;
            }
        }
    }
}