using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Herencia.Capas;
using Exferia_EntityFramework;
using Exferia_General;
using Exferia_GestionDocumental._0_Modelos;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_GestionDocumental._1_Datos
{
    public class GTD_Documentos_BusquedaEtiquetas_Datos 
    {
        #region MODELOS

        #region Modelo Listado
        private List<GTD_Documentos_BusquedaEtiquetas> g_lst_GTD_Documentos_BusquedaEtiquetas = null;

        public List<GTD_Documentos_BusquedaEtiquetas> Obtener_ModeloListado_Por_IdsDocumento(List<long> _lst_idDocumento,
                                                                        bool _bol_Cargar_DocumentoTipoEtiqueta)
        {
            try
            {

                string str_Filtro_Etiquetas = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GTD_Documentos_BusquedaEtiquetas),
                                                                                                   nameof(GTD_Documentos_BusquedaEtiquetas.idDocumento),
                                                                                                   G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.NADA,
                                                                                                   _lst_idDocumento);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " +
                                       str_Filtro_Etiquetas;

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 new object[] { },
                                                _bol_Cargar_DocumentoTipoEtiqueta
                                                 );

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GTD_Documentos_BusquedaEtiquetas_Datos) + "/" + nameof(Obtener_ModeloListado_Por_IdsDocumento), true);
            }

            return g_lst_GTD_Documentos_BusquedaEtiquetas;
        }

        #region Ejecutar Consulta

        //Listado de modelos Relacionados
        private List<GTD_DocumentosTipos_Etiquetas> g_lst_GTD_DocumentosTipos_Etiquetas = null;

        //Hilos
        private static int g_int_TotalHilos_Modelo_Listado = 1;
        private bool[] g_bol_Hilos_Terminados_Modelo_Listado = new bool[g_int_TotalHilos_Modelo_Listado];

        private void Ejecutar_Consulta_Modelo_Listado(string _str_SQL,
                                                        object[] _arr_Parametros,
                                                        bool _bol_Cargar_DocumentoTipoEtiqueta)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Rellenar el modelo
                g_lst_GTD_Documentos_BusquedaEtiquetas = obj_Exferia_Entities.Database.SqlQuery<GTD_Documentos_BusquedaEtiquetas>(_str_SQL, _arr_Parametros).ToList();

                #region Rellenar tablas Relacionadas
                if (g_lst_GTD_Documentos_BusquedaEtiquetas != null && g_lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                {
                    if (_bol_Cargar_DocumentoTipoEtiqueta)
                    {
                        #region PRIMERO BUSCO LOS DATOS DE LAS TABLAS RELACIONADAS
                        //reiniciar Valores de los hilos
                        for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Modelo_Listado; int_Contador++)
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[int_Contador] = false;
                        }

                        //GTD_DocumentosTipos_Etiquetas ############################################# 
                        if (_bol_Cargar_DocumentoTipoEtiqueta)
                        {
                            ThreadStart obj_ThreadStart_DOCUMENTOTIPOETIQUETA = new ThreadStart(Obtener_DocumentosTiposEtiquetas_Modelo_Listado);
                            Thread obj_Thread_DOCUMENTOTIPOETIQUETA = new Thread(obj_ThreadStart_DOCUMENTOTIPOETIQUETA);
                            obj_Thread_DOCUMENTOTIPOETIQUETA.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
                        }

                        //Esperando a que terminen todos los hilos .........................................
                        bool bol_Termino = false;
                        while (bol_Termino == false)
                        {
                            bol_Termino = true;
                            foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_Modelo_Listado)
                            {
                                if (bol_Termino_Hilo == false)
                                {
                                    bol_Termino = false;
                                    break;
                                }
                            }

                            Thread.Sleep(10);
                        }
                        //.................................................................................

                        #endregion

                        #region DESPUES SE LO VOY ASIGNANDO A LOS REGISTRO UNO A UNO
                        foreach (GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas in g_lst_GTD_Documentos_BusquedaEtiquetas)
                        {
                            //GTD_DocumentosTipos_Etiquetas #############################################
                            if (_bol_Cargar_DocumentoTipoEtiqueta &&
                                mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta!=null && 
                                g_lst_GTD_DocumentosTipos_Etiquetas != null &&
                                g_lst_GTD_DocumentosTipos_Etiquetas.Count > 0)
                            {
                                mdl_GTD_Documentos_BusquedaEtiquetas.GTD_DocumentosTipos_Etiquetas = g_lst_GTD_DocumentosTipos_Etiquetas.Where(m => m.id == mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta.Value).FirstOrDefault();
                            }
                        }
                        #endregion
                    }

                }

                #endregion


            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GTD_Documentos_BusquedaEtiquetas_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo_Listado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }
        #region TablasRelacionadas
        private void Obtener_DocumentosTiposEtiquetas_Modelo_Listado()
        {
            try
            {
                GTD_DocumentosTipos_Etiquetas_Datos obj_GTD_DocumentosTipos_Etiquetas_Datos = new GTD_DocumentosTipos_Etiquetas_Datos();
                g_lst_GTD_DocumentosTipos_Etiquetas = obj_GTD_DocumentosTipos_Etiquetas_Datos.Obtener_ModeloListado_Por_Ids(g_lst_GTD_Documentos_BusquedaEtiquetas.Where(m => m.idDocumentoTipoEtiqueta != null).Select(m => m.idDocumentoTipoEtiqueta.Value).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
            }
        }
        #endregion

        #endregion

        #endregion

        private string Obtener_Consulta_Modelo()
        {
            return
               " SELECT " +
                    nameof(GTD_Documentos_BusquedaEtiquetas) + "." + nameof(GTD_Documentos_BusquedaEtiquetas.id) + " , " +
                    nameof(GTD_Documentos_BusquedaEtiquetas) + "." + nameof(GTD_Documentos_BusquedaEtiquetas.idDocumento) + " , " +
                    nameof(GTD_Documentos_BusquedaEtiquetas) + "." + nameof(GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta) + " , " +
                    nameof(GTD_Documentos_BusquedaEtiquetas) + "." + nameof(GTD_Documentos_BusquedaEtiquetas.porPlantilla) + " , " +
                    nameof(GTD_Documentos_BusquedaEtiquetas) + "." + nameof(GTD_Documentos_BusquedaEtiquetas.valor) + " , " +
                    nameof(GTD_Documentos_BusquedaEtiquetas) + "." + nameof(GTD_Documentos_BusquedaEtiquetas.posicionDocumento_CabeceraPieOtra) +
               " FROM " + nameof(GTD_Documentos_BusquedaEtiquetas);
        }
        #endregion

        #region Grabar
        public INTERNO_ValorDevuelto_Modelo Insertar(GTD_Documentos_BusquedaEtiquetas _mdl_GTD_Documentos_BusquedaEtiquetas)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas_Final = new GTD_Documentos_BusquedaEtiquetas();

                //Tipo de Accion que se va a realizar
                mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_INSERTAR;

                // Cargar los Datos del Modelo
                Funciones.CopiarPropiedadesObjetos(_mdl_GTD_Documentos_BusquedaEtiquetas, mdl_GTD_Documentos_BusquedaEtiquetas_Final, false, false);

                #region INSERT
                string str_SQL_Insert = " INSERT INTO " + nameof(GTD_Documentos_BusquedaEtiquetas) +
                                            " (" +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.idDocumento) + "," +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta) + "," +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.porPlantilla) + "," +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.valor) + "," +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.posicionDocumento_CabeceraPieOtra) +
                                            " ) " +
                                            " OUTPUT INSERTED." + nameof(GTD_Documentos_BusquedaEtiquetas.id) +
                                            " VALUES " +
                                            " ( " +
                                                "@idDocumento," +
                                                "@idDocumentoTipoEtiqueta," +
                                                "@porPlantilla," +
                                                "@valor," +
                                                "@posicionDocumento_CabeceraPieOtra" +
                                            " ) ";
                //Parametros
                object[] arr_Parametros_Insert = new object[]
                {
                    new SqlParameter("@idDocumento", mdl_GTD_Documentos_BusquedaEtiquetas_Final.idDocumento),
                    mdl_GTD_Documentos_BusquedaEtiquetas_Final.idDocumentoTipoEtiqueta != null
                    ?   new SqlParameter("@idDocumentoTipoEtiqueta", mdl_GTD_Documentos_BusquedaEtiquetas_Final.idDocumentoTipoEtiqueta.Value)
                    :   new SqlParameter("@idDocumentoTipoEtiqueta",  DBNull.Value),
                    new SqlParameter("@porPlantilla", mdl_GTD_Documentos_BusquedaEtiquetas_Final.porPlantilla),
                    mdl_GTD_Documentos_BusquedaEtiquetas_Final.valor != null
                    ?   new SqlParameter("@valor", mdl_GTD_Documentos_BusquedaEtiquetas_Final.valor.Trim())
                    :   new SqlParameter("@valor",  ""),
                    new SqlParameter("@posicionDocumento_CabeceraPieOtra", mdl_GTD_Documentos_BusquedaEtiquetas_Final.posicionDocumento_CabeceraPieOtra)
                };
                #endregion

                //Id de la tabla
                mdl_INTERNO_ValorDevuelto_Modelo.Id = obj_Exferia_Entities.Database.SqlQuery<long>(str_SQL_Insert, arr_Parametros_Insert).Single();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GTD_Documentos_BusquedaEtiquetas_Datos) + "/" + nameof(Insertar), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public INTERNO_ValorDevuelto_Modelo Actualizar(GTD_Documentos_BusquedaEtiquetas _mdl_GTD_Documentos_BusquedaEtiquetas)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas_Final = new GTD_Documentos_BusquedaEtiquetas();

                //Tipo de Accion que se va a realizar
                mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_MODIFICAR;

                // Cargar los Datos del Modelo
                Funciones.CopiarPropiedadesObjetos(_mdl_GTD_Documentos_BusquedaEtiquetas, mdl_GTD_Documentos_BusquedaEtiquetas_Final, false, false);

                #region UPDATE
                string str_SQL_Update = "UPDATE " + nameof(GTD_Documentos_BusquedaEtiquetas) +
                                            " SET " +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.idDocumento) + "=@idDocumento," +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta) + "=@idDocumentoTipoEtiqueta," +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.porPlantilla) + "=@porPlantilla," +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.valor) + "=@valor," +
                                                    nameof(GTD_Documentos_BusquedaEtiquetas.posicionDocumento_CabeceraPieOtra) + "=@posicionDocumento_CabeceraPieOtra " +
                                            " WHERE " +
                                                nameof(GTD_Documentos_BusquedaEtiquetas.id) + "=@id";
                //Parametros
                object[] arr_Parametros_Update = new object[]
                {
                    new SqlParameter("@idDocumento", mdl_GTD_Documentos_BusquedaEtiquetas_Final.idDocumento),
                    mdl_GTD_Documentos_BusquedaEtiquetas_Final.idDocumentoTipoEtiqueta != null
                    ?   new SqlParameter("@idDocumentoTipoEtiqueta", mdl_GTD_Documentos_BusquedaEtiquetas_Final.idDocumentoTipoEtiqueta.Value)
                    :   new SqlParameter("@idDocumentoTipoEtiqueta",  DBNull.Value),
                    new SqlParameter("@porPlantilla", mdl_GTD_Documentos_BusquedaEtiquetas_Final.porPlantilla),
                    mdl_GTD_Documentos_BusquedaEtiquetas_Final.valor != null
                    ?   new SqlParameter("@valor", mdl_GTD_Documentos_BusquedaEtiquetas_Final.valor.Trim())
                    :   new SqlParameter("@valor",  ""),
                    new SqlParameter("@posicionDocumento_CabeceraPieOtra", mdl_GTD_Documentos_BusquedaEtiquetas_Final.posicionDocumento_CabeceraPieOtra),
                    new SqlParameter("@id", mdl_GTD_Documentos_BusquedaEtiquetas_Final.id)
                };
                #endregion

                //Update
                obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Update, arr_Parametros_Update);

                //Id de la tabla
                mdl_INTERNO_ValorDevuelto_Modelo.Id = mdl_GTD_Documentos_BusquedaEtiquetas_Final.id;
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GTD_Documentos_BusquedaEtiquetas_Datos) + "/" + nameof(Actualizar), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion
    }
}
