using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Informes;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_Informes._0_Modelos;
using Exferia_Informes._1_Datos;
using Exferia_Informes._3_Vistas.ControlesPersonalizados_DentroPaneles;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;
using System.Xml;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Informes._3_Vistas.Controladoras
{
    public class P_Impresoras_DocumentoLocal_Controladora
    {
        #region Variables Generales
        private P_Impresoras_DocumentoLocal g_frm_P_Impresoras_DocumentoLocal = null;//Variable 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_Termino_CargaDatos_Inicial = false;//Se utiliza para saber cuando se termina la carga de datos estaticos inciales

        private INF_Impresoras_Datos g_obj_INF_Impresoras_Datos = new INF_Impresoras_Datos();

        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

        private List<INTERNO_CodigoDescripcion_Modelo> g_lst_INTERNO_CodigoDescripcion_Modelo_IMPRESORAS = new List<INTERNO_CodigoDescripcion_Modelo>();

       
        //Variables para la Creacion de la Lineas de las impresoras apra el Documento Local############
        private int g_int_NumeroLineas_ImpresoraDocumentoLocal = 0;
        private List<int> g_Array_ListadoLineas_ImpresoraDocumentoLocal = new List<int>();
        private int g_int_PosicionY_ImpresoraDocumentoLocal = 5;
        #endregion

        // Constructor de la clase Logica
        public P_Impresoras_DocumentoLocal_Controladora(P_Impresoras_DocumentoLocal _frm_P_Impresoras_DocumentoLocal)
        {
            g_frm_P_Impresoras_DocumentoLocal = _frm_P_Impresoras_DocumentoLocal;

            //Cargar Impresoras Locales
            int int_CodigoImpresoraLocal = 1;
            foreach (string str_NombreImpresora in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            {
                g_lst_INTERNO_CodigoDescripcion_Modelo_IMPRESORAS.Add(new INTERNO_CodigoDescripcion_Modelo(int_CodigoImpresoraLocal.ToString(), str_NombreImpresora));

                int_CodigoImpresoraLocal += 1;
            }

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        
        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Impresoras_DocumentoLocal.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = true;
                }

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Impresoras_DocumentoLocal.Enabled = true;

                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

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

            try
            {
                //Buscar las impresoras .......................................................................
                INF_Impresoras_Datos obj_INF_Impresoras_Datos = new INF_Impresoras_Datos();
                List<INF_Impresoras> lst_INF_Impresoras = obj_INF_Impresoras_Datos.Obtener_ModeloListado(true);

                //Crear las Lineas 
                if (lst_INF_Impresoras != null && lst_INF_Impresoras.Count() > 0)
                {
                    List<object> lst_Argumentos = null;
                    INTERNO_Impresoras_DocumentoLocal_Modelo mdl_INTERNO_Impresoras_DocumentoLocal_Modelo = null;
                    foreach (INF_Impresoras mdl_INF_Impresoras in lst_INF_Impresoras)
                    {
                        mdl_INTERNO_Impresoras_DocumentoLocal_Modelo = null;


                        if (Variables.G_DCT_IMPRESORASLOCALES_GRABADAS.Count > 0 &&
                            Variables.G_DCT_IMPRESORASLOCALES_GRABADAS.ContainsKey(mdl_INF_Impresoras.codigo))
                        {
                            mdl_INTERNO_Impresoras_DocumentoLocal_Modelo = Variables.G_DCT_IMPRESORASLOCALES_GRABADAS[mdl_INF_Impresoras.codigo];
                        }

                        lst_Argumentos = new List<object>();
                        lst_Argumentos.Add(mdl_INF_Impresoras);
                        lst_Argumentos.Add(mdl_INTERNO_Impresoras_DocumentoLocal_Modelo);

                        ((BackgroundWorker)sender).ReportProgress(1, lst_Argumentos);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Impresoras_DocumentoLocal_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_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, nameof(P_Impresoras_DocumentoLocal_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_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_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage == 1)
                {
                    List<object> lst_Argumentos = (List<object>) e.UserState;

                    Crear_Impresora_Linea((INF_Impresoras)lst_Argumentos[0] , (INTERNO_Impresoras_DocumentoLocal_Modelo)lst_Argumentos[1]);
                }
            }
            catch (Exception ex)
            {

                Control_Errores.Errores_Log("", ex, nameof(P_Impresoras_DocumentoLocal_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_ProgressChanged));
            }
        }
        private void TareaAsincrona_CargarDatos_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_Impresoras_DocumentoLocal.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)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_Impresoras_DocumentoLocal.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Impresoras_DocumentoLocal_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Impresoras_DocumentoLocal.Salir_P_Base();
            }
        }

        #endregion

        #region Control de Usuario Impresora Local
        private void Crear_Impresora_Linea(INF_Impresoras _mdl_INF_Impresoras, INTERNO_Impresoras_DocumentoLocal_Modelo _mdl_INTERNO_Impresoras_DocumentoLocal_Modelo)
        {
            //Añadir control creado en subproceso en el hilo principal ...............................................
            if (g_frm_P_Impresoras_DocumentoLocal.InvokeRequired) // Line #1
            {
                g_frm_P_Impresoras_DocumentoLocal.Invoke((MethodInvoker)delegate
                {
                    Crear_Impresora_Linea(_mdl_INF_Impresoras, _mdl_INTERNO_Impresoras_DocumentoLocal_Modelo);
                });
                return;
            }

            g_int_NumeroLineas_ImpresoraDocumentoLocal += 1;

            //Calcular tamaño el panel #######################
            int int_AnchoPanelprincipal = (624 * g_frm_P_Impresoras_DocumentoLocal.Exferia_Panel_Degradado_DocumentoLocal_Seleccion.Width) / 634;
            if (g_frm_P_Impresoras_DocumentoLocal.Exferia_Panel_Degradado_DocumentoLocal_Seleccion.Controls != null && g_frm_P_Impresoras_DocumentoLocal.Exferia_Panel_Degradado_DocumentoLocal_Seleccion.Controls.Count > 0 && g_Array_ListadoLineas_ImpresoraDocumentoLocal.Count > 0)
            {
                int_AnchoPanelprincipal = g_frm_P_Impresoras_DocumentoLocal.Exferia_Panel_Degradado_DocumentoLocal_Seleccion.Controls.Find("controlusuario_CTU_P_Impresoras_DL_Imp" + g_Array_ListadoLineas_ImpresoraDocumentoLocal[0], false).FirstOrDefault().Width;
            }

            //Objeto Personalizado
            CTU_P_Impresoras_DL_Imp controlusuario_CTU_P_Impresoras_DL_Imp = new CTU_P_Impresoras_DL_Imp(g_frm_P_Impresoras_DocumentoLocal, g_int_NumeroLineas_ImpresoraDocumentoLocal, _mdl_INF_Impresoras, g_lst_INTERNO_CodigoDescripcion_Modelo_IMPRESORAS, _mdl_INTERNO_Impresoras_DocumentoLocal_Modelo);
            controlusuario_CTU_P_Impresoras_DL_Imp.Name = "controlusuario_CTU_P_Impresoras_DL_Imp" + g_int_NumeroLineas_ImpresoraDocumentoLocal;
            controlusuario_CTU_P_Impresoras_DL_Imp.Size = new Size(int_AnchoPanelprincipal, 120);
            controlusuario_CTU_P_Impresoras_DL_Imp.Location = new Point(5, g_int_PosicionY_ImpresoraDocumentoLocal);
            controlusuario_CTU_P_Impresoras_DL_Imp.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left);

            //Añadir al panel Principal
            g_frm_P_Impresoras_DocumentoLocal.Exferia_Panel_Degradado_DocumentoLocal_Seleccion.Controls.Add(controlusuario_CTU_P_Impresoras_DL_Imp);
            g_Array_ListadoLineas_ImpresoraDocumentoLocal.Add(g_int_NumeroLineas_ImpresoraDocumentoLocal);

            g_int_PosicionY_ImpresoraDocumentoLocal+= controlusuario_CTU_P_Impresoras_DL_Imp.Height + 5;
            
            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_GEN_EJERCICIOACTIVO, g_frm_P_Impresoras_DocumentoLocal.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, false)) == false)
            {
                //Bloqueo los Controles
                SoloLectura.Empezar(controlusuario_CTU_P_Impresoras_DL_Imp, true);
            }
        }
        private List<INTERNO_Impresoras_DocumentoLocal_Modelo> Obtener_Impresoras_DocumentoLocal_Panel()
        {
            List<INTERNO_Impresoras_DocumentoLocal_Modelo> lst_INTERNO_Impresoras_DocumentoLocal_Modelo = new List<INTERNO_Impresoras_DocumentoLocal_Modelo>();
            CTU_P_Impresoras_DL_Imp obj_CTU_P_Impresoras_DL_Imp = null;
            INTERNO_Impresoras_DocumentoLocal_Modelo mdl_INTERNO_Impresoras_DocumentoLocal_Modelo = null;

            foreach (int int_ValorLinea in g_Array_ListadoLineas_ImpresoraDocumentoLocal)
            {
                obj_CTU_P_Impresoras_DL_Imp = (CTU_P_Impresoras_DL_Imp)g_frm_P_Impresoras_DocumentoLocal.Exferia_Panel_Degradado_DocumentoLocal_Seleccion.Controls.Find("controlusuario_CTU_P_Impresoras_DL_Imp" + int_ValorLinea, true).FirstOrDefault();

                if (obj_CTU_P_Impresoras_DL_Imp != null)
                {
                    mdl_INTERNO_Impresoras_DocumentoLocal_Modelo = obj_CTU_P_Impresoras_DL_Imp.Devoler_Objeto();

                    if (mdl_INTERNO_Impresoras_DocumentoLocal_Modelo != null)
                    {
                        lst_INTERNO_Impresoras_DocumentoLocal_Modelo.Add(mdl_INTERNO_Impresoras_DocumentoLocal_Modelo);
                    }
                 
                }
            }

            return lst_INTERNO_Impresoras_DocumentoLocal_Modelo;
        }
        #endregion

        public void Grabar()
        {
            try
            {
                Funciones_FicherosXML.ModificarXML_ImpresoraDocumentoLocal(Obtener_Impresoras_DocumentoLocal_Panel());

                Variables.G_DCT_IMPRESORASLOCALES_GRABADAS.Clear();
                Funciones_FicherosXML.CargarDatosXML_ImpresoraDocumentoLocal();

                //Cambiar el Icono que aparece en el Form Principal
                Funciones.Cambiar_Icono_Impresora_PantallaPrincipal(g_obj_INF_Impresoras_Datos.Devolver_Asignacion_ImpresorasLocales());

                g_frm_P_Impresoras_DocumentoLocal.Salir_P_Base();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Impresoras_DocumentoLocal_Controladora) + "/" + nameof(Grabar));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_MODIFICAR_DATOSXML());
            }
        }

    }
}
