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

namespace LLNet.Tienda.Dialogs.Refunds
{
    public partial class dlgCoupon : GUI.FormBases.frmBase
    {
        #region Constructor

        public dlgCoupon()
        {
            InitializeComponent();

            GUI.CApp.TraducirForm(this);
        }

        #endregion

        private decimal originalValue;
        private bool isValidAmount;

        #region Metodos

        public override void Init(object[] pArgs)
        {
            base.Init(pArgs);
            dsPDV1 = Program.FrmMainPos.DsVale;
        }

        #region ExchangeCoupon

        public int ExchangeCoupon(decimal pVale)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("VALE", pVale.ToString());

            dsPDV1.DOC_VALES.Clear();
            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.DOC_VALES.TableName, qp, "FillByVale"), dsPDV1);

            if (dsPDV1.DOC_VALES.Rows.Count > 0)
            {
                if (dsPDV1.DOC_VALES[0].VENCE_EL < DateTime.Today)
                {
                    GUI.CApp.ShowMessage(GUI.CApp.TraducirPalabra("La fecha de vencimiento del vale/certificado de regalo fue el ") + dsPDV1.DOC_VALES[0].VENCE_EL.ToShortDateString(), GUI.CApp.TraducirPalabra("Vales y Certificados de Regalo"),false);
                    return 0;
                }
                else
                    return 1;
            }
            else 
                return 0;
        }

        private int Exchange(decimal pVale, decimal pMonto)
        {

            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("VALE", pVale.ToString());
            
            object vSku = 0;
            if (dsPDV1.DOC_VALES[0].TIPO == "A")
                vSku = GUI.CApp.GetParam("SPIC");
            else
                vSku = GUI.CApp.GetParam("SPIV");

            if (vSku != null && vSku != System.DBNull.Value)
            {
                qp.Clear();
                qp.AddReplaceParam("SKU", vSku.ToString());
                qp.AddReplaceParam("SOCIO", dsPDV1.DOC_VALES[0]["SOCIO"].ToString());

                decimal vPctImp = (decimal)GUI.CApp.bll.GetSingleValue("GetTaxes", qp, "PDV");
                decimal vPrecio = pMonto;
                decimal vPrecioUnitario = vPrecio / (1 + (vPctImp / 100));
                decimal vImpuesto = vPrecio - vPrecioUnitario;

                Program.FrmMainPos.pos.ctlAddSkus1.InsertOrderLine(
                    null, -1, GUI.CApp.usuario, Math.Round(vPrecioUnitario, 6), Math.Round(vImpuesto, 6), null, null, Convert.ToDecimal(vSku), dsPDV1.DOC_VALES[0].VALE, null, null);

                if (pMonto < originalValue)
                {
                    Model.PDV.DsPDV.DOC_VALESRow dvr = dsPDV1.DOC_VALES.NewDOC_VALESRow();
                    dvr.VALE = Convert.ToDecimal(GUI.CApp.GetSecuence("DOC_S_VALE"));
                    dvr["DE_PARTE_DE"] = dsPDV1.DOC_VALES[0]["DE_PARTE_DE"];
                    dvr["A_NOMBRE_DE"] = dsPDV1.DOC_VALES[0]["A_NOMBRE_DE"];
                    dvr["VENCE_EL"] = dsPDV1.DOC_VALES[0]["VENCE_EL"];
                    dvr.TIPO = "A";
                    dvr.ESTADO = "E";
                    dvr.MONTO = originalValue - pMonto;
                    dvr.JORNADA = (decimal)Program.Jornada;
                    dvr.CREADO_POR = GUI.CApp.usuario;
                    dvr.CREADO_EL = DateTime.Now;
                    dvr.VALE_PADRE = pVale;
                    dvr["SOCIO"] = dsPDV1.DOC_VALES[0]["SOCIO"];
                    dsPDV1.DOC_VALES.AddDOC_VALESRow(dvr);

                }
                
                GUI.CApp.bll.updateDataSet(Program.FrmMainPos.DsVale, Program.FrmMainPos.DsVale.DOC_VALES.TableName);

                dsPDV1.DOC_VALES[0].ESTADO = "C";
                return 1;
            }
            else
            {
                GUI.CApp.ShowMessage("No está configurado correctamente el producto para canjes de vales o certificados de regalo, consulte con su administrador", "Canje de Vales y Certificados de Regalo", true);
                return 0;
            }
        }

        #endregion

        #endregion

        #region Eventos

        private void dlgCoupon_Load(object sender, EventArgs e)
        {
            txtVale.Focus();
        }
        
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (dsPDV1.DOC_VALES.Count > 0)
            {
                if (Utils.Helpers.IntToBool(Exchange(dsPDV1.DOC_VALES[0].VALE, calcMonto.Value)))
                {
                    Program.FrmMainPos.RefreshData();
                    DialogResult = DialogResult.OK;
                }
                else
                    GUI.CApp.ShowMessage("El vale no existe, venció o ya fue canjeado", "Canje de Vales o Certificados", true);
            }
            else
            {
                GUI.CApp.ShowMessage("Ingrese un número de vale o certificado", "Canje de Vales o Certificados", true);
                txtVale.Focus();
            }
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }

        private void textEdit1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                findCoupon();
            }
        }

        private void findCoupon()
        {
            calcMonto.EditValue = 0;
            if (txtVale.Text != string.Empty)
            {
                int result = ExchangeCoupon(Convert.ToDecimal(txtVale.Text));
                if (Utils.Helpers.IntToBool(result))
                {
                    calcMonto.EditValue = dsPDV1.DOC_VALES[0].MONTO;
                    originalValue = dsPDV1.DOC_VALES[0].MONTO;
                }
                else
                    GUI.CApp.ShowMessage("El vale no existe, venció o ya fue canjeado", "Canje de Vales o Certificados", true);
            }
        }

        private void dlgCoupon_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F12:
                    btnAceptar_Click(null, null);
                    break;
                case Keys.Escape:
                    simpleButton1_Click(null, null);
                    break;
            }
        }

        #endregion

        private void calcMonto_Validating(object sender, CancelEventArgs e)
        {
            if (((DevExpress.XtraEditors.CalcEdit)sender).Value <= originalValue)
                isValidAmount = true;
            else
            {
                isValidAmount = false;
                e.Cancel = true;
                GUI.CApp.ShowMessage("El monto no puede ser mayor al monto del vale o certificado", "Canje de Vales y Certificados", true);
            }

        }

        private void txtVale_Validating(object sender, CancelEventArgs e)
        {
            findCoupon();
        }

    }
}