using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LLNet.Utils;
using LLNet.GUI;

namespace LLNet.Tienda.MainForms.Forms
{
    public partial class FrmCambioPago : Form
    {
        private decimal vDocumento = 0;
        private string vFactura = String.Empty;
        private int vEmisor = 0;
        private int vLinea = 0;
        private decimal vMonto = 0;
        /// <summary>
        /// Nombre del tipo de pago
        /// </summary>
        private string vPago = String.Empty;
        private string vRubro = String.Empty;
        /// <summary>
        /// Tipo pago origen
        /// </summary>
        private int vTipoPago = 0;
        private string vUsuario = String.Empty;

        public FrmCambioPago()
        {
            InitializeComponent();
        }

        #region Propiedades

        public decimal Documento
        {
            set
            {
                this.vDocumento = value;
            }
        }

        public int Emisor
        {
            set
            {
                this.vEmisor = value;
            }
        }

        public string Factura
        {
            set
            {
                this.vFactura = value;
            }
        }

        public int Linea
        {
            set
            {
                this.vLinea = value;
            }
        }

        public decimal Monto
        {
            set
            {
                this.vMonto = value;
            }
        }

        public string Rubro
        {
            set
            {
                this.vRubro = value;
            }
        }

        public string Pago
        {
            set
            {
                this.vPago = value;
            }
        }

        public int TipoPago
        {
            set
            {
                this.vTipoPago = value;
            }
        }

        public string Usuario
        {
            set
            {
                this.vUsuario = value;
            }
        }

        #endregion

        #region mExisteVale
        /// <summary>
        /// Indica si el vale ingresado, esta como emitido y existe
        /// </summary>
        /// <returns>True o false</returns>
        private bool mExisteVale()
        {
            bool vExiste = false;

            Utils.QueryParams vParametros = new QueryParams();
            vParametros.AddReplaceParam("VALE", txtVale.Text);

            vExiste = Convert.ToBoolean(GUI.CApp.bll.GetSingleValue("ExisteValeEmitido", vParametros, "PDV"));

            if (!vExiste)
            {
                CApp.ShowMessage("El vale no existe o ya fue aplicado en una factura/recibo", "Cambio de Pago", true);
            }

            return vExiste;
        }
        #endregion

        #region mLimpiarCampos
        /// <summary>
        /// Limpia los campos asociados a la forma de pago nueva
        /// </summary>
        private void mLimpiarCampos()
        {
            txtTarjeta.Text = String.Empty;
            txtAutorizacion.Text = String.Empty;
            txtVale.Text = String.Empty;
            txtReferencia.Text = String.Empty;
            txtIdProv.Text = String.Empty;
        }
        #endregion

        #region mMostrarDatos
        /// <summary>
        /// Llena los campos del formulario
        /// </summary>
        private void mMostrarDatos()
        {
            txtFactura.Text = vFactura;
            txtMonto.Text = vMonto.ToString();
            txtFormaPagoO.Text = vPago;
        }
        #endregion

        #region mObtenerEmisor
        /// <summary>
        /// Obtiene el emisor del tipo de pago seleccionado
        /// </summary>
        private string mObtenerEmisor()
        {
            string vEmisorNuevo = "";
            try
            {
                var vResultado = from vTabla in ((DataTable)cbxTipoPagos.DataSource).AsEnumerable()
                                 where vTabla.Field<string>("PAGO") == cbxTipoPagos.Text
                                 select vTabla.Field<decimal>("EMISOR");

                if (vResultado.Count() > 0)
                {
                    vEmisorNuevo = vResultado.ElementAt(0).ToString();
                }
            }
            catch (InvalidCastException)
            {
                vEmisorNuevo = String.Empty;
            }

            return vEmisorNuevo;
        }
        #endregion

        #region mObtenerPedidoVoucher
        /// <summary>
        /// Obtiene el pedido asociado a un voucher de credie o de credix
        /// </summary>
        /// <returns>Número de pedido</returns>
        private decimal mObtenerPedidoVoucher()
        {
            decimal vPedido = 0;

            Utils.QueryParams vParametros = new QueryParams();
            vParametros.AddReplaceParam("TIPO_PAGO", cbxTipoPagos.SelectedValue.ToString());            
            vParametros.AddReplaceParam("JORNADA", Program.Jornada.ToString());
            vParametros.AddReplaceParam("REFERENCIA", txtReferencia.Text);

            if (cbxTipoPagos.SelectedValue.ToString() == "32")
            {
                vParametros.AddReplaceParam("AUTORIZACION", txtAutorizacion.Text);
                vParametros.AddReplaceParam("ID_PROV", "NULL");
            }
            else if (cbxTipoPagos.SelectedValue.ToString() == "34")
            {
                vParametros.AddReplaceParam("AUTORIZACION", DBNull.Value.ToString());
                vParametros.AddReplaceParam("ID_PROV", txtIdProv.Text);
            }

            vPedido = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("POS_F_PEDIDO_VOUCHER", vParametros, "PDV"));

            return vPedido;
        }
        #endregion

        #region mRealizarCambio
        /// <summary>
        /// Envía los datos para realizar el cambio de tipos de pago
        /// </summary>
        private void mRealizarCambio()
        {
            bool vContinuar = true;
            string vEmisorNuevo = String.Empty;
            decimal vPedido = 0;

            vEmisorNuevo = mObtenerEmisor();

            if (vEmisorNuevo == String.Empty)
            {
                vEmisorNuevo = "NULL";
            }

            // Verifica si el tipo de pago es credix o credie
            if (cbxTipoPagos.SelectedValue.ToString() == "32" || 
                cbxTipoPagos.SelectedValue.ToString() == "34")
            {
                // Obtiene el pedido asociado al voucher
                vPedido = mObtenerPedidoVoucher();
            }

            // Verifica si el tipo de pago es vale
            if (cbxTipoPagos.SelectedValue.ToString() == "6")
            {
                vContinuar = mExisteVale();
            }

            if (vContinuar)
            {
                Utils.QueryParams vParametros = new QueryParams();
                vParametros.AddReplaceParam("DOCUMENTO", vDocumento.ToString());
                vParametros.AddReplaceParam("LINEA", vLinea.ToString());
                vParametros.AddReplaceParam("TIPO_PAGO", cbxTipoPagos.SelectedValue.ToString());
                vParametros.AddReplaceParam("EMISOR", vEmisorNuevo);
                vParametros.AddReplaceParam("RUBRO", vRubro);
                vParametros.AddReplaceParam("USUARIO", vUsuario);
                vParametros.AddReplaceParam("JORNADA", Program.Jornada.ToString());
                vParametros.AddReplaceParam("TARJETA", txtTarjeta.Text);
                vParametros.AddReplaceParam("AUTORIZACION", txtAutorizacion.Text);

                if (txtVale.Text == String.Empty)
                {
                    vParametros.AddReplaceParam("VALE", "NULL");
                }
                else
                {
                    vParametros.AddReplaceParam("VALE", txtVale.Text);
                }

                GUI.CApp.bll.ExecuteSql("WMS_P_MODIF_FORMAPAGO", vParametros, "PDV");

                // Log
                vParametros = new QueryParams();
                vParametros.AddReplaceParam("JORNADA", Program.Jornada.ToString());
                vParametros.AddReplaceParam("TIPO_PAGO_ORIGEN", vTipoPago.ToString());
                vParametros.AddReplaceParam("TIPO_PAGO_FINAL", cbxTipoPagos.SelectedValue.ToString());

                if (vEmisor == 0)
                {
                    vParametros.AddReplaceParam("EMISOR_ORIGEN", "NULL");
                }
                else
                {
                    vParametros.AddReplaceParam("EMISOR_ORIGEN", vEmisor.ToString());
                }

                vParametros.AddReplaceParam("EMISOR_FINAL", vEmisorNuevo);
                vParametros.AddReplaceParam("RUBRO", vRubro);
                vParametros.AddReplaceParam("USUARIO", vUsuario);
                vParametros.AddReplaceParam("RAZON", txtRazon.Text);

                if (vPedido == 0)
                {
                    vParametros.AddReplaceParam("DOCUMENTO_ORIGEN", "NULL");
                }
                else
                {
                    vParametros.AddReplaceParam("DOCUMENTO_ORIGEN", vPedido.ToString());
                }

                vParametros.AddReplaceParam("DOCUMENTO_FINAL", vDocumento.ToString());
                vParametros.AddReplaceParam("LINEA", vLinea.ToString());

                GUI.CApp.bll.ExecuteSql("WMS_P_LOG_CAMBIO_PAGO", vParametros, "PDV");

                CApp.ShowMessage("Cambio realizado con éxito", "Cambio de Pago", true);
                this.Dispose();
            }
        }
        #endregion

        #region mTipoPagos
        /// <summary>
        /// Obtiene los tipos de pagos para cargarlos en el combobox
        /// </summary>
        private void mTipoPagos()
        {
            cbxTipoPagos.SelectedIndexChanged -= new EventHandler(cbxTipoPagos_SelectedIndexChanged);

            Utils.QueryParams vParametros = new QueryParams();
            vParametros.AddReplaceParam("PAGO", vPago);

            cbxTipoPagos.DataSource = null;

            // Obtiene las formas de pago
            using (DataSet vdatos = GUI.CApp.bll.getDataSet("PDV", "POS_V_TIPO_PAGOS", vParametros))
            {
                // Verifica que tenga datos
                if (vdatos.Tables.Count > 0 && vdatos.Tables[0].Rows.Count > 0)
                {
                    cbxTipoPagos.DataSource = vdatos.Tables[0];
                    cbxTipoPagos.ValueMember = "TIPO_PAGO";
                    cbxTipoPagos.DisplayMember = "PAGO";
                }
                else
                {
                    btnAceptar.Enabled = false;
                }
            }

            cbxTipoPagos.SelectedIndexChanged += new EventHandler(cbxTipoPagos_SelectedIndexChanged);
            cbxTipoPagos_SelectedIndexChanged(null, null);
        }
        #endregion

        #region btnAceptar_Click
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                // Verifica que se haya seleccionado un tipo de pago
                if (cbxTipoPagos.SelectedValue == null)
                {
                    CApp.ShowMessage("Seleccione la nueva forma de pago", "Cambio de Pago", true);
                    cbxTipoPagos.Focus();
                }
                else if (txtVale.Visible && txtVale.Text == String.Empty)
                {
                    CApp.ShowMessage("Ingrese el número de vale", "Cambio de Pago", true);
                    txtVale.Focus();
                }                
                else if (txtAutorizacion.Visible && txtAutorizacion.Text == String.Empty)
                {
                    CApp.ShowMessage("Ingrese el número de autorización", "Cambio de Pago", true);
                    txtAutorizacion.Focus();
                }
                else if (txtTarjeta.Visible && txtTarjeta.Text == String.Empty)
                {
                    CApp.ShowMessage("Ingrese el número de tarjeta", "Cambio de Pago", true);
                    txtTarjeta.Focus();
                }
                else if (txtIdProv.Visible && txtIdProv.Text == String.Empty)
                {
                    CApp.ShowMessage("Ingrese el número de id del proveedor", "Cambio de Pago", true);
                    txtAutorizacion.Focus();
                }
                else if (txtReferencia.Visible && txtReferencia.Text == String.Empty)
                {
                    CApp.ShowMessage("Ingrese el número de referencia", "Cambio de Pago", true);
                    txtAutorizacion.Focus();
                }
                else if (txtRazon.Text == String.Empty)
                {
                    CApp.ShowMessage("Ingrese la razón del cambio", "Cambio de Pago", true);
                    txtRazon.Focus();
                }

                  /*ECHO POR Richard Vargas Martinez 05/06/2019*/
                else if (txtAutorizacion.Visible && txtAutorizacion.Text == string.Empty)
                {
                    CApp.ShowMessage("Ingrese la autorización", "Cambio de Pago", true);
                    txtAutorizacion.Focus();
                }
                // FIN
                else
                {
                    mRealizarCambio();
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Cambio de Pago", true);
            }
        }
        #endregion

        #region btnSalir_Click
        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }
        #endregion

        #region FrmCambioPago_Load
        private void FrmCambioPago_Load(object sender, EventArgs e)
        {
            try
            {
                mMostrarDatos();
                mTipoPagos();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Cambio de Pago", true);
            }
        }
        #endregion

        #region FrmCambioPago_KeyDown
        private void FrmCambioPago_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                switch (e.KeyCode)
                {
                    case Keys.F12:
                        btnAceptar_Click(null, null);
                        break;
                    case Keys.Escape:
                        btnSalir_Click(null, null);
                        break;
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Cambio de Pago", true);
            }
        }
        #endregion

        #region cbxTipoPagos_SelectedIndexChanged
        private void cbxTipoPagos_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (cbxTipoPagos.Text == "VALES" || cbxTipoPagos.SelectedValue.ToString() == "6")
                {
                    txtTarjeta.Visible = false;
                    txtAutorizacion.Visible = false;
                    txtIdProv.Visible = false;
                    txtReferencia.Visible = false;
                    lblAutorizacion.Visible = false;
                    lblIdProv.Visible = false;
                    lblReferencia.Visible = false;
                    lblTarjeta.Visible = false;
                    //
                    txtVale.Visible = true;
                    lblVale.Visible = true;
                    //
                    mLimpiarCampos();
                    //
                    txtVale.Focus();
                }
                else if (cbxTipoPagos.SelectedValue.ToString() == "32")// Credix
                {
                    txtTarjeta.Visible = false;
                    txtAutorizacion.Visible = true;
                    txtIdProv.Visible = false;
                    txtReferencia.Visible = true;
                    lblTarjeta.Visible = false;
                    lblAutorizacion.Visible = true;
                    lblIdProv.Visible = false;
                    lblReferencia.Visible = true;
                    //
                    txtVale.Visible = false;
                    lblVale.Visible = false;
                    //
                    mLimpiarCampos();
                    //
                    txtAutorizacion.Focus();
                }
                else if (cbxTipoPagos.SelectedValue.ToString() == "34")// Credie
                {
                    txtTarjeta.Visible = false;
                    txtAutorizacion.Visible = false;
                    txtIdProv.Visible = true;
                    txtReferencia.Visible = true;
                    lblTarjeta.Visible = false;
                    lblAutorizacion.Visible = false;
                    lblIdProv.Visible = true;
                    lblReferencia.Visible = true;
                    //
                    txtVale.Visible = false;
                    lblVale.Visible = false;
                    //
                    mLimpiarCampos();
                    //
                    txtIdProv.Focus();
                }

                 /*Echo por Richard Vargas Martinez 05/06/2019*/
                else if (cbxTipoPagos.SelectedValue.ToString() == "35")//Flexi 
                {
                    txtTarjeta.Visible = false;
                    txtAutorizacion.Visible = true;
                    txtIdProv.Visible = false;
                    txtReferencia.Visible = false;
                    lblTarjeta.Visible = false;
                    lblAutorizacion.Visible = true;
                    lblIdProv.Visible = false;
                    lblReferencia.Visible = false;
                    //
                    txtVale.Visible = false;
                    lblVale.Visible = false;
                    //
                    mLimpiarCampos();
                    //
                    txtAutorizacion.Focus();

                }
                /* Fin Richard Vargas Martinez*/
                else if (cbxTipoPagos.SelectedValue.ToString() == "3")// Efectivo
                {
                    txtTarjeta.Visible = false;
                    txtAutorizacion.Visible = false;
                    txtIdProv.Visible = false;
                    txtReferencia.Visible = false;
                    lblTarjeta.Visible = false;
                    lblAutorizacion.Visible = false;
                    lblIdProv.Visible = false;
                    lblReferencia.Visible = false;
                    //
                    txtVale.Visible = false;
                    lblVale.Visible = false;
                    //
                    mLimpiarCampos();
                }
                else
                {
                    txtTarjeta.Visible = true;
                    txtAutorizacion.Visible = true;
                    txtIdProv.Visible = false;
                    txtReferencia.Visible = false;
                    lblTarjeta.Visible = true;
                    lblAutorizacion.Visible = true;
                    lblIdProv.Visible = false;
                    lblReferencia.Visible = false;
                    //
                    txtVale.Visible = false;
                    lblVale.Visible = false;
                    //
                    mLimpiarCampos();
                    //
                    txtAutorizacion.Focus();
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Cambio de Pago", true);
            }
        }
        #endregion
    }
}