using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Linq;
using System.Globalization;
using Exferia_Aplicacion.Modelos_Listado_Filtros;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Formularios
{
    public partial class PE_Listados_Filtros_Opciones : P_Base
    {
        #region Variables privadas

        private INTERNO_ABS_Listado_ColumnasDatos_Modelo g_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = null;

        private INTERNO_Listado_Filtros_Opciones_Modelo g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL = null;

        #endregion

        #region Propiedades Publicas

        public bool g_bol_BotonAceptar = false;
        public INTERNO_Listado_Filtros_Opciones_Modelo g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo = null;
        #endregion

        #region Constructor
        public PE_Listados_Filtros_Opciones(INTERNO_ABS_Listado_ColumnasDatos_Modelo _mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo, 
                                            INTERNO_Listado_Filtros_Opciones_Modelo _mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL)
        {
            InitializeComponent();

            g_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = _mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo;
            g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL = _mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL;

            Repintar.Empezar(this);

            //Poner Nombre del Campo
            lbl_NombreCampo.Text = g_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_AMostrar;

            ex_chklst_Opciones.DataSource = _mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.LISTADO;
            ex_chklst_Opciones.DisplayMember = nameof(INTERNO_Filtro_Opciones_Listado_Modelo.NOMBRE);

            //Numerico
            if (_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.TIPO==2)
            {
                ex_chklst_Opciones.ValueMember = nameof(INTERNO_Filtro_Opciones_Listado_Modelo.VALOR_NUMERO);
            }
            //Texto
            else
            {
                ex_chklst_Opciones.ValueMember = nameof(INTERNO_Filtro_Opciones_Listado_Modelo.VALOR_TEXTO);
            }
            

            //Cargar Los Valores Iniciales si los tuviera
            if (g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL != null && 
                (
                (_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.TIPO == 2 &&
                g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL.VALOR_NUMERO != null &&
                g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL.VALOR_NUMERO.Count>0) ||
                (_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.TIPO == 1 &&
                g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL.VALOR_TEXTO != null &&
                g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL.VALOR_TEXTO.Count > 0)))
            {

                //Numerico
                if (_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.TIPO == 2)
                {
                    foreach (int int_Valor in g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL.VALOR_NUMERO)
                    {
                        int int_index = ex_chklst_Opciones.Items.IndexOf(
                                        _mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.LISTADO.Where(m => m.VALOR_NUMERO.Equals(int_Valor)).FirstOrDefault());
                        if (int_index > -1)
                        {
                            ex_chklst_Opciones.SetItemChecked(int_index, true);
                        }
                    }
                }
                //Texto
                else
                {
                    foreach (string str_Valor in g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo_INICIAL.VALOR_TEXTO)
                    {
                        int int_index = ex_chklst_Opciones.Items.IndexOf(
                                        _mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.LISTADO.Where(m => m.VALOR_TEXTO.Equals(str_Valor)).FirstOrDefault());
                        if (int_index > -1)
                        {
                            ex_chklst_Opciones.SetItemChecked(int_index, true);
                        }
                    }
                }
            }
        }
        #endregion

        private void ex_btn_Aceptar_Click(object sender, EventArgs e)
        {
            Aceptar();
        }
        private void Aceptar()
        {
            try
            {
                List<INTERNO_Filtro_Opciones_Listado_Modelo> lst_INTERNO_Filtro_Opciones_Listado_Modelo_SELECCIONADOS = ex_chklst_Opciones.CheckedItems.Cast<INTERNO_Filtro_Opciones_Listado_Modelo>().ToList();

                if (lst_INTERNO_Filtro_Opciones_Listado_Modelo_SELECCIONADOS!=null && lst_INTERNO_Filtro_Opciones_Listado_Modelo_SELECCIONADOS.Count > 0)
                {
                    //Inicializar valores
                    g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo = new INTERNO_Listado_Filtros_Opciones_Modelo();
                    g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo.VALOR_TEXTO = new List<string>();
                    g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo.VALOR_NUMERO = new List<int>();

                    foreach (INTERNO_Filtro_Opciones_Listado_Modelo mdl_INTERNO_Filtro_Opciones_Listado_Modelo in lst_INTERNO_Filtro_Opciones_Listado_Modelo_SELECCIONADOS)
                    {
                        g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo.CAMPO= g_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;

                        //Numerico
                        if (g_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.TIPO == 2)
                        {
                            g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo.VALOR_NUMERO.Add(mdl_INTERNO_Filtro_Opciones_Listado_Modelo.VALOR_NUMERO);
                        }
                        //Texto
                        else
                        {
                            g_mdl_INTERNO_Listado_Filtros_Opciones_Modelo.VALOR_TEXTO.Add(mdl_INTERNO_Filtro_Opciones_Listado_Modelo.VALOR_TEXTO);
                        }
                       
                    }
                }

                g_bol_BotonAceptar = true;

                Close();

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(PE_Listados_Filtros_Opciones) + "/" + nameof(ex_btn_Aceptar_Click));

                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_SELECCIONFILTROS());
            }
        }

        private void ex_chklst_Opciones_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (g_mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Opciones_Modelo.MULTISELECCION == false)
            {
                if (e.NewValue == CheckState.Checked)
                    for (int ix = 0; ix < ex_chklst_Opciones.Items.Count; ++ix)
                        if (e.Index != ix) ex_chklst_Opciones.SetItemChecked(ix, false);
            }
        }

        //Teclas de Acceso Rapido
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Enter)//Seleccionado registro y salir
            {
                Aceptar();
                return true;
            }
            else if (keyData == Keys.F10)//Salir sin Seleccionar
            {
                Salir_P_Base();
                return true;
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

        
    }
}
