using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General._0_Modelos;
using Exferia_General._1_Datos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;

namespace Exferia_General._3_Vistas.Controladoras
{
    class P_Configuracion_CampoCodigo_Controladora
    {
        #region Variables Generales
        private P_Configuracion_CampoCodigo g_frm_P_Configuracion_CampoCodigo = null;//Varible que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar,guardar,etc..

        public bool g_bol_PermisosCodigo_Cambiados = false;
        public bool g_bol_Grabar_Datos_TodoCorrecto = true;

        //Clases de Datos necesarias
        private PRV_Opcion_Objeto_Permiso_Datos g_obj_PRV_Opcion_Objeto_Permiso_Datos = new PRV_Opcion_Objeto_Permiso_Datos();
        private GEN_Configuracion_CampoCodigo_Datos g_obj_GEN_Configuracion_CampoCodigo_Datos = new GEN_Configuracion_CampoCodigo_Datos();

        //Listados Generales Iniciales
        List<INTERNO_PRV_PermisosOpciones_Modelo> g_lst_INTERNO_PRV_PermisosOpciones_Modelo = null;
        List<GEN_Configuracion_CampoCodigo> g_lst_GEN_Configuracion_CampoCodigo = null;

        //Variables de Bloqueo para Carga de Datos
        public bool g_bol_CargandoDatos = false;

        //Tarea Asincrona de Carga de Datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos_EnMemoria;
        private bool g_bol_CargarDatos_EnMemoria_Opciones = false;
        private bool g_bol_CargarDatos_EnMemoria = false;

        public string g_str_ValorCelda_CONPERMISO = "V";
        public string g_str_ValorCelda_VACIO = "";

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_Grabar_Datos;

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_Borrar_Datos;

        public enum G_ENUM_ESTADOCELDA
        {
            CONPERMISO = 0,
            VACIO = 2
        }
        public enum G_ENUM_ESTADO
        {
            ALFANUMERICO = 0,
            NUMERICO = 1,
            NOMODIFICABLE = 2
        }

        #endregion

        #region DataGridView Posicion Campos
        public int g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_Opcion = 0;
        public int g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_IdObjeto = 1;
        public int g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_OpcionPadre = 2;
        public int g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_OpcionPadre_Inicial = 3;
        public int g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_ExpandirContraer = 4;
        public int g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_Descripcion = 5;
        public int g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_ALFANUMERICO = 6;
        public int g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_NUMERICO = 7;
        #endregion

        public P_Configuracion_CampoCodigo_Controladora(P_Configuracion_CampoCodigo _frm_P_Configuracion_CampoCodigo)
        {
            g_frm_P_Configuracion_CampoCodigo = _frm_P_Configuracion_CampoCodigo;
        }

        #region Cargar Datos
        public void CargarDatos_EnMemoria(bool _bol_CargarDatos_EnMemoria_Opciones,bool _bol_CargarDatos_EnMemoria)
        {
            try
            {
                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                g_bol_CargarDatos_EnMemoria_Opciones = _bol_CargarDatos_EnMemoria_Opciones;
                g_bol_CargarDatos_EnMemoria = _bol_CargarDatos_EnMemoria;

                //Vaciar Grid
                if (g_bol_CargarDatos_EnMemoria)
                {
                    g_frm_P_Configuracion_CampoCodigo.Exferia_DataGridView_Configuracion_CampoCodigo.DataSource = null;
                }

                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Configuracion_CampoCodigo.Enabled = false;

                //Bandera para que no grabe a la hora de cambiar los valores
                g_bol_CargandoDatos = true;

                //Si la tarea asicrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos_EnMemoria != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos_EnMemoria.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_EnMemoria_DoWork);
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_EnMemoria_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_EnMemoria_Completed);
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria.WorkerReportsProgress = true;
                }

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_CargarDatos_EnMemoria.RunWorkerAsync();
                //#################################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                //Bandera para que no grabe a la hora de cambiar los valores
                g_bol_CargandoDatos = false;

                g_frm_P_Configuracion_CampoCodigo.Enabled = true;

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Permisos_Controladora) + "/" + nameof(CargarDatos_EnMemoria), true);
            }
        }
        private void TareaAsincrona_CargarDatos_EnMemoria_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                if (g_bol_CargarDatos_EnMemoria_Opciones)
                {
                    g_lst_INTERNO_PRV_PermisosOpciones_Modelo = g_obj_PRV_Opcion_Objeto_Permiso_Datos.Obtener_Listado();

                    g_lst_GEN_Configuracion_CampoCodigo = g_obj_GEN_Configuracion_CampoCodigo_Datos.Obtener_ModeloListado();

                    //Cargar Valores Objetos ................................................
                    if (g_lst_INTERNO_PRV_PermisosOpciones_Modelo == null || g_lst_INTERNO_PRV_PermisosOpciones_Modelo.Count==0)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                    }
                    else
                    {
                        foreach(var obj_valores in g_lst_INTERNO_PRV_PermisosOpciones_Modelo.Where(n => n.opcionPadre == null).GroupBy(m => new { m.descripcion,m.opcion})
                                                                                                                                            .Select(m => new
                                                                                                                                            {
                                                                                                                                                m.Key.opcion,
                                                                                                                                                m.Key.descripcion
                                                                                                                                            })
                                                                                                                                            .OrderBy(m => m.descripcion).ToList())
                        {
                            //Se cancelo la tarea asincrona ##################################
                            if (((BackgroundWorker)sender).CancellationPending)
                            {
                                e.Cancel = true;
                                return;
                            }

                            //Añadir Fila con Columnas ........................................
                            Cargar_Opcion_E_Hijos(obj_valores.opcion,null,"",((BackgroundWorker)sender),"");
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_EnMemoria_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_EnMemoria_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_EnMemoria_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage == 1)
                {
                    g_frm_P_Configuracion_CampoCodigo.Exferia_DataGridView_Configuracion_CampoCodigo.Rows.Add((DataGridViewRow)e.UserState);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_EnMemoria_ProgressChanged));
            }
        }
        private void TareaAsincrona_CargarDatos_EnMemoria_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_Configuracion_CampoCodigo.Enabled = true;

            try
            {
                g_frm_P_Configuracion_CampoCodigo.Exferia_DataGridView_Configuracion_CampoCodigo.AutoGenerateColumns = false;

                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_Configuracion_CampoCodigo.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_EnMemoria_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Configuracion_CampoCodigo.Salir_P_Base();
            }
            finally
            {
                g_bol_CargandoDatos = false;
            }
        }

        private void Cargar_Opcion_E_Hijos(string _str_Opcion, long? _lng_idObjeto, string _str_OpcionPadre, BackgroundWorker _obj_BackgroundWorker, string _str_OpcionPadre_Inicial)
        {
            //Permisos Permitidos
            List<int> lst_PermisosPermitidos = new List<int>();
            INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX = null;

            //IdObjeto #########################################
            if(_lng_idObjeto != null)
            {
                foreach(INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo in g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                                .Where(n => n.idObjeto != null && n.idObjeto.Value.Equals(_lng_idObjeto) &&
                                                                                            (_str_OpcionPadre.Trim().Length > 0 ? (n.opcionPadre != null && n.opcionPadre.Equals(_str_OpcionPadre)) : n.opcionPadre == null))
                                                                                .ToList())
                {
                    lst_PermisosPermitidos.Add(2);
                }
                //Para tener los otros datos necesarios
                mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX = g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                                                    .Where(n => n.idObjeto != null && n.idObjeto.Value.Equals(_lng_idObjeto) &&
                                                                                                                    (_str_OpcionPadre.Trim().Length > 0 ? (n.opcionPadre != null && n.opcionPadre.Equals(_str_OpcionPadre)) : n.opcionPadre == null))
                                                                                                    .FirstOrDefault();
            }
            //Opcion ###########################
            else
            {
                foreach (INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo in g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                                .Where(n => n.opcion != null && n.opcion.Equals(_str_Opcion) &&
                                                                                            (_str_OpcionPadre.Trim().Length > 0 ? (n.opcionPadre != null && n.opcionPadre.Equals(_str_OpcionPadre)) : n.opcionPadre == null))
                                                                                .ToList())
                {
                    if (Variables.G_DCT_CONFIGURACIONCAMPOCODIGO_OPCIONTABLACAMPOCODIGO.ContainsKey(mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion))
                    {
                        if (Variables.G_LST_GEN_CONFIGURACION_CAMPOCODIGO == null)
                        {
                            Variables.G_LST_GEN_CONFIGURACION_CAMPOCODIGO = new List<GEN_Configuracion_CampoCodigo>();
                        }

                        if (Variables.G_LST_GEN_CONFIGURACION_CAMPOCODIGO.Exists(x => x.opcion.Equals(mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion)))
                        {
                            lst_PermisosPermitidos.Add(1);
                        }
                        else
                        {
                            lst_PermisosPermitidos.Add(0);
                        }
                    }
                    else
                    {
                        lst_PermisosPermitidos.Add(2);
                    }
                }
                //Para tener los otros datos necesarios
                mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX = g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                                                    .Where(n => n.opcion != null && n.opcion.Equals(_str_Opcion) &&
                                                                                                                    (_str_OpcionPadre.Trim().Length > 0 ? (n.opcionPadre != null && n.opcionPadre.Equals(_str_OpcionPadre)) : n.opcionPadre == null))
                                                                                                    .FirstOrDefault();
            }

            //Saber se is Hijo o Padre
            bool bol_Hijo = false;
            if (_str_OpcionPadre.Trim().Length > 0)
            {
                bol_Hijo = true;
            }

            //Convertir a row las Opciones
            DataGridViewRow obj_DataGridViewRow = Transformar_Modelo_A_Row_PermisosOpciones(lst_PermisosPermitidos,mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX,bol_Hijo,_str_OpcionPadre_Inicial);
            _obj_BackgroundWorker.ReportProgress(1,obj_DataGridViewRow);
            Thread.Sleep(1);

            if (_str_OpcionPadre_Inicial.Trim().Length == 0)
            {
                _str_OpcionPadre_Inicial = _str_Opcion;
            }

            //Opciones Hijas
            foreach(string str_OpcionesHijas in g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                            .Where(n => n.opcion != null && n.opcionPadre != null && n.opcionPadre.Equals(_str_Opcion))
                                                                            .GroupBy(m => m.opcion)
                                                                            .OrderBy(m => m.Key).Select(m => m.Key).ToList())
            {
                Cargar_Opcion_E_Hijos(str_OpcionesHijas,null,_str_Opcion,_obj_BackgroundWorker,_str_OpcionPadre_Inicial);
            }

            //Objetos Hijos
            foreach(long lng_idObjeto in g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                    .Where(n => n.idObjeto != null && n.opcionPadre != null && n.opcionPadre.Equals(_str_Opcion) && n.idObjeto != null)
                                                                            .GroupBy(m => m.idObjeto.Value)
                                                                            .OrderBy(m => m.Key).Select(m => m.Key).ToList())
            {
                Cargar_Opcion_E_Hijos("",lng_idObjeto,_str_Opcion, _obj_BackgroundWorker,_str_OpcionPadre_Inicial);
            }
        }

        private DataGridViewRow Transformar_Modelo_A_Row_PermisosOpciones(List<int> _lst_PermisosPermitidos, INTERNO_PRV_PermisosOpciones_Modelo _mdl_INTERNO_PRV_PermisosOpciones_Modelo, bool _bol_Hijo, string _str_OpcionPadre_Inicial)
        {
            DataGridViewRow obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Configuracion_CampoCodigo.Exferia_DataGridView_Configuracion_CampoCodigo.RowTemplate.Clone();
            obj_DataGridViewRow.CreateCells(g_frm_P_Configuracion_CampoCodigo.Exferia_DataGridView_Configuracion_CampoCodigo);

            //Rellenar las celdas de la fila
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_Opcion].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion : "";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_IdObjeto].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.idObjeto;
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_OpcionPadre].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcionPadre : "";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_OpcionPadre_Inicial].Value = _str_OpcionPadre_Inicial;
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_ExpandirContraer].Value = "/";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_ExpandirContraer].ToolTipText = "Contraer";

            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_Descripcion].Value = (_mdl_INTERNO_PRV_PermisosOpciones_Modelo.idObjeto != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.ObjetoDescripcion_AMostrar : _mdl_INTERNO_PRV_PermisosOpciones_Modelo.descripcion);

            //se quedan vacias por ahora para cargar la pantalla ya se cambiará
            //ALFANUMÉRICO
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_ESTADO.ALFANUMERICO))
            {
                Cambio_Texto_Celda(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_ALFANUMERICO], G_ENUM_ESTADOCELDA.CONPERMISO, false);
            }
            else
            {
                Cambio_Texto_Celda(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_ALFANUMERICO], G_ENUM_ESTADOCELDA.VACIO, false);
            }

            //NUMÉRICO
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_ESTADO.NUMERICO))
            {
                Cambio_Texto_Celda(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_NUMERICO], G_ENUM_ESTADOCELDA.CONPERMISO, false);
            }
            else
            {
                Cambio_Texto_Celda(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_NUMERICO], G_ENUM_ESTADOCELDA.VACIO, false);
            }

            //si no pueden ser numericos se bloquea
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_ESTADO.NOMODIFICABLE))
            {
                Cambio_Texto_Celda(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_ALFANUMERICO],G_ENUM_ESTADOCELDA.VACIO,true);
                Cambio_Texto_Celda(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PermisosCodigo_Alfanumerico_numerico_NUMERICO], G_ENUM_ESTADOCELDA.VACIO, true);
            }


            return obj_DataGridViewRow;
        }

        #endregion

        #region Grabar Datos
        public void Grabar_Datos(string _str_Opcion)
        {
            try
            {
                g_frm_P_Configuracion_CampoCodigo.Enabled = false;

                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                //Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_Grabar_Datos != null)
                {
                    while (g_obj_TareaAsincrona_Grabar_Datos.IsBusy)
                        Application.DoEvents();

                }
                else
                {
                    g_obj_TareaAsincrona_Grabar_Datos = new BackgroundWorker();
                    g_obj_TareaAsincrona_Grabar_Datos.DoWork += new DoWorkEventHandler(TareaAsincrona_Grabar_DoWork);
                    g_obj_TareaAsincrona_Grabar_Datos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Grabar_Completed);
                }

                //argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_Opcion);

                g_obj_TareaAsincrona_Grabar_Datos.RunWorkerAsync(lst_Argumentos);

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Configuracion_CampoCodigo.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(Grabar_Datos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }

        }
        private void TareaAsincrona_Grabar_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;

                string str_Opcion = (string)lst_Argumentos[0];

                INTERNO_TablaCampoCodigo_Modelo mdl_INTERNO_TablaCampoCodigo_Modelo = Variables.G_DCT_CONFIGURACIONCAMPOCODIGO_OPCIONTABLACAMPOCODIGO[str_Opcion];
                if (mdl_INTERNO_TablaCampoCodigo_Modelo != null)
                {
                    //Validar Primero
                    INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos(mdl_INTERNO_TablaCampoCodigo_Modelo.Tabla,mdl_INTERNO_TablaCampoCodigo_Modelo.CampoCodigo);
                    if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo = Grabar_Final(str_Opcion, mdl_INTERNO_TablaCampoCodigo_Modelo);
                    }
                    else
                    {
                        mdl_ValorDevuelto_Modelo_VALIDACION.Mensaje = "No se Puede poner Numérico ya que posee Codigos Alfanuméricos";
                        mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                        g_bol_Grabar_Datos_TodoCorrecto = false;
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(TareaAsincrona_Grabar_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(TareaAsincrona_Grabar_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Grabar_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if(g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Configuracion_CampoCodigo.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo.Mensaje);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(TareaAsincrona_Grabar_Completed));
            }
        }
        public INTERNO_ValorDevuelto_Modelo ValidarDatos(string _str_NombreTabla, string _str_NombreCampo)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Comprobamos si posee algún dato alfanumerico
                mdl_ValorDevuelto_Modelo = g_obj_GEN_Configuracion_CampoCodigo_Datos.Comprobar_Tiene_Alfanumericos(_str_NombreTabla, _str_NombreCampo);
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(ValidarDatos));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo Grabar_Final( string _str_Opcion, INTERNO_TablaCampoCodigo_Modelo _mdl_INTERNO_TablaCampoCodigo_Modelo)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    //Rellenar el modelo a grabar
                    GEN_Configuracion_CampoCodigo mdl_GEN_Configuracion_CampoCodigo = new GEN_Configuracion_CampoCodigo();
                    mdl_GEN_Configuracion_CampoCodigo.opcion = _str_Opcion;
                    mdl_GEN_Configuracion_CampoCodigo.nombreCampoCodigo = _mdl_INTERNO_TablaCampoCodigo_Modelo.CampoCodigo;

                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_GEN_Configuracion_CampoCodigo_Datos.Grabar(mdl_GEN_Configuracion_CampoCodigo);

                    //Si fue todo correcto elimino los ceros de la izquierda del campo codigo de la tabla
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = g_obj_GEN_Configuracion_CampoCodigo_Datos.Actualizar_Quitar_Ceros(_mdl_INTERNO_TablaCampoCodigo_Modelo.Tabla,mdl_GEN_Configuracion_CampoCodigo.nombreCampoCodigo);
                    }

                    //Si todo va bien
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Completo la transaccion
                        transaccion_SQL.Complete();

                        //Añado la opcion al Listado
                        Variables.G_LST_GEN_CONFIGURACION_CAMPOCODIGO.Add(mdl_GEN_Configuracion_CampoCodigo);
                    }
                    else
                    {
                        g_bol_Grabar_Datos_TodoCorrecto = false;
                    }

                    return mdl_INTERNO_ValorDevuelto_Modelo;
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    g_bol_Grabar_Datos_TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(Grabar_Final));
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    g_bol_Grabar_Datos_TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                finally
                {
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void Borrar(string _str_Opcion)
        {
            try
            {
                g_frm_P_Configuracion_CampoCodigo.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                g_obj_TareaAsincrona_Borrar_Datos = new BackgroundWorker();
                g_obj_TareaAsincrona_Borrar_Datos.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_DoWork);
                g_obj_TareaAsincrona_Borrar_Datos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_Completed);
                g_obj_TareaAsincrona_Borrar_Datos.RunWorkerAsync(_str_Opcion);

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                g_frm_P_Configuracion_CampoCodigo.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(Borrar));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_Borrar_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_Opcion = (string)e.Argument;

                //Borrar
                mdl_ValorDevuelto_Modelo = Borrar_Final(str_Opcion);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(TareaAsincrona_Borrar_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(TareaAsincrona_Borrar_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Borrar_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Configuracion_CampoCodigo.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo Borrar_Final(string _str_Opcion)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_GEN_Configuracion_CampoCodigo_Datos.Borrar(_str_Opcion);

                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    //Borro la opcion del listado
                    Variables.G_LST_GEN_CONFIGURACION_CAMPOCODIGO.RemoveAll(x=>x.opcion.Equals(_str_Opcion));
                }

                return mdl_INTERNO_ValorDevuelto_Modelo;
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Configuracion_CampoCodigo_Controladora) + "/" + nameof(Borrar_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        public void Cambio_Texto_Celda(DataGridViewCell _dgvc_Celda, G_ENUM_ESTADOCELDA _enum_EstadoCelda, bool _bol_Bloquear)
        {
            //Tiene permiso
            if (_enum_EstadoCelda.Equals(G_ENUM_ESTADOCELDA.CONPERMISO))
            {
                _dgvc_Celda.Value = g_str_ValorCelda_CONPERMISO;

                
                _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_PERMISOS_PERFILES;
                _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_PERMISOS_PERFILES;
                

                _dgvc_Celda.Style.ForeColor = Colores.G_COLOR_LETRA_PERMISOS_CON;
                _dgvc_Celda.Style.SelectionForeColor = Colores.G_COLOR_LETRA_PERMISOS_CON;
            }
            //vacio
            else
            {
                _dgvc_Celda.Value = g_str_ValorCelda_VACIO;

                
                _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_PERMISOS_NORMAL;
                _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_PERMISOS_NORMAL;
                
            }
            _dgvc_Celda.Tag = "0";

            //Bloquear
            if (_bol_Bloquear)
            {
                _dgvc_Celda.ReadOnly = true;
                _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_BLOQUEADO;
                _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_BLOQUEADO;
                _dgvc_Celda.Tag = "1";
            }
        }
    }
}
