using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using Exferia_GestionDocumental._0_Modelos;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Exferia_GestionDocumental.General
{
    public class Funciones_GestionDocumental
    {
        public static string QuitarCaracteresEspeciales(string _str_Texto)
        {
            return _str_Texto.Replace(" ", "").Replace(".", "").Replace("\n", "");
        }

        public static string Limpiar_Valores_Etiquetas(string _str_Valor_Etiqueta)
        {
            if (_str_Valor_Etiqueta!=null && 
                _str_Valor_Etiqueta.Trim().Length>0)
            {
                //Quitar [ ]
                _str_Valor_Etiqueta = _str_Valor_Etiqueta.Replace("[", "");
                _str_Valor_Etiqueta = _str_Valor_Etiqueta.Replace("]", "");

                //Quitar |
                _str_Valor_Etiqueta = _str_Valor_Etiqueta.Replace("|", "");

                // Quitar \n
                _str_Valor_Etiqueta = _str_Valor_Etiqueta.Replace("\n", "");
            }

            return _str_Valor_Etiqueta;
        }
        public static string QuitarEspaciosEnBlanco_Valores_Etiquetas(string _str_Valor_Etiqueta)
        {
            if (_str_Valor_Etiqueta != null &&
                _str_Valor_Etiqueta.Trim().Length > 0)
            {
                _str_Valor_Etiqueta = _str_Valor_Etiqueta.Replace(" ", "");
            }

            return _str_Valor_Etiqueta;
        }


        #region Rellenar_Extensiones
        public static List<string> Rellenar_Extensiones_PDF()
        {
            List<string> lst_Extensiones = new List<string>();

            lst_Extensiones.Add(".pdf");

            return lst_Extensiones;
        }
        public static List<string>  Rellenar_Extensiones_IMAGEN()
        {
            List<string> lst_Extensiones = new List<string>();

            lst_Extensiones.Add(".bmp");
            lst_Extensiones.Add(".jpg");
            lst_Extensiones.Add(".jpeg");
            lst_Extensiones.Add(".png");
            lst_Extensiones.Add(".gif");

            return lst_Extensiones;
        }
        public static List<string>  Rellenar_Extensiones_WORD()
        {
            List<string> lst_Extensiones = new List<string>();

            lst_Extensiones.Add(".doc");
            lst_Extensiones.Add(".docx");

            return lst_Extensiones;
        }

        public static List<string> Rellenar_Extensiones_EXCEL()
        {
            List<string> lst_Extensiones = new List<string>();

            lst_Extensiones.Add(".xls");
            lst_Extensiones.Add(".xlsx");

            return lst_Extensiones;
        }
        #endregion

        public static int Archivo_Tipo(PdfReader _obj_PdfReader, bool _bol_Imagen)
        {
            int int_ArchivoTipo = 0;// 0 -> PDFA / 1-> PDF / 2-> IMAGEN

            try
            {
                //Tipo Imagen
                if (_bol_Imagen)
                {
                    int_ArchivoTipo = 2;
                }
                //Tipo PDF
                else
                {
                    if (_obj_PdfReader != null)
                    {
                        string str_Valor_Devuelto = PdfTextExtractor.GetTextFromPage(_obj_PdfReader, 1);

                        if (str_Valor_Devuelto.Trim().Length == 0)
                        {
                            int_ArchivoTipo = 1;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Funciones_GestionDocumental) + "/" + nameof(Archivo_Tipo));
            }

            return int_ArchivoTipo;
        }

        public static string Aplicacion_Instalada(string _str_NombreAplicacion)
        {
            string str_Ruta = "";

            try
            {
                RegistryKey localMachine64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
                RegistryKey obj_RegistryKey_SofWare = localMachine64.OpenSubKey(@"Software\", false);

                foreach (var obj_SubKeyNames in obj_RegistryKey_SofWare.GetSubKeyNames())
                {
                    Microsoft.Win32.RegistryKey obj_RegistryKey_Aplicacion = obj_RegistryKey_SofWare.OpenSubKey(obj_SubKeyNames);
                    if (obj_RegistryKey_Aplicacion != null)
                    {

                        //Comparar Nombres de Aplicacion
                        string str_NombreAplicacion_Instalada = Convert.ToString(obj_RegistryKey_Aplicacion.GetValue("CreatorID"));

                        if (str_NombreAplicacion_Instalada.Equals(_str_NombreAplicacion, StringComparison.OrdinalIgnoreCase))
                        {
                            if (obj_RegistryKey_Aplicacion.GetValue("InstallDir") != null &&
                                obj_RegistryKey_Aplicacion.GetValue("InstallDir").ToString().Length > 0)
                            {
                                str_Ruta = obj_RegistryKey_Aplicacion.GetValue("InstallDir").ToString();

                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Funciones_GestionDocumental) + "/" + nameof(Aplicacion_Instalada));
            }

            return str_Ruta;
        }

        public static string Obtener_NombreFichero_Final(GTD_PlantillasDocumentosCabecera _mdl_GTD_PlantillasDocumentosCabecera, INTERNO_DatosDocumento_Modelo _mdl_INTERNO_DatosDocumento_Modelo)
        {
            string str_NombreFichero = "";

            PdfReader obj_PdfReader = null;
            try
            {
                if (_mdl_GTD_PlantillasDocumentosCabecera != null &&
                    _mdl_GTD_PlantillasDocumentosCabecera.GTD_PlantillasDocumentosLineas != null &&
                    _mdl_GTD_PlantillasDocumentosCabecera.GTD_PlantillasDocumentosLineas.Count > 0 &&
                    _mdl_GTD_PlantillasDocumentosCabecera.nombreFicheroPorDefecto != null &&
                    _mdl_GTD_PlantillasDocumentosCabecera.nombreFicheroPorDefecto.Trim().Length > 0 &&
                    (_mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF != null ||
                     _mdl_INTERNO_DatosDocumento_Modelo.Documento_Original != null))
                {
                    List<INTERNO_CodigoDescripcion_Modelo> lst_INTERNO_CodigoDescripcion_Modelo = new List<INTERNO_CodigoDescripcion_Modelo>();


                    string str_Valor_Devuelto = "";
                    obj_PdfReader = new PdfReader(_mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF);

                    foreach (GTD_PlantillasDocumentosLineas mdl_GTD_PlantillasDocumentosLineas in _mdl_GTD_PlantillasDocumentosCabecera.GTD_PlantillasDocumentosLineas)
                    {
                        if (mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta != null)
                        {

                            //Buscar el DocumentoTipoEtiqueta
                            GTD_DocumentosTipos_Etiquetas mdl_GTD_DocumentosTipos_Etiquetas = _mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas.Where(m => m.id == mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta.Value).FirstOrDefault();
                            if (mdl_GTD_DocumentosTipos_Etiquetas != null)
                            {
                                System.util.RectangleJ obj_RectangleJ_Elemento = new System.util.RectangleJ(float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionX_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionY_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.ancho_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.alto_En_Documento));
                                RenderFilter[] arr_RenderFilter_Elemento = { new RegionTextRenderFilter(obj_RectangleJ_Elemento) };
                                ITextExtractionStrategy obj_ITextExtractionStrategy_Elemento = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), arr_RenderFilter_Elemento);
                                str_Valor_Devuelto = PdfTextExtractor.GetTextFromPage(obj_PdfReader, (mdl_GTD_PlantillasDocumentosLineas.posicionDocumento_CabeceraPieOtra == Variables_GestionDocumental.G_INT_POSICIONDOCUMENTO_PIE ? obj_PdfReader.NumberOfPages : 1), obj_ITextExtractionStrategy_Elemento);

                                //Ver si tengo que limpiar el valor
                                if (mdl_GTD_PlantillasDocumentosLineas.limpiar != null && mdl_GTD_PlantillasDocumentosLineas.limpiar.Value)
                                {
                                    str_Valor_Devuelto = Limpiar_Valores_Etiquetas(str_Valor_Devuelto);
                                }

                                //Agregar Valor
                                lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo("[" + mdl_GTD_DocumentosTipos_Etiquetas.descripcion + "]", str_Valor_Devuelto));
                                }
                        }

                    }

                    string str_NombreFichero_AUX = Funciones.Transformar_Texto_Con_Parametros(_mdl_GTD_PlantillasDocumentosCabecera.nombreFicheroPorDefecto, lst_INTERNO_CodigoDescripcion_Modelo);

                    if (str_NombreFichero_AUX.Trim().Length > 0)
                    {
                        str_NombreFichero_AUX = str_NombreFichero_AUX.Replace(" ", "");
                        str_NombreFichero_AUX = str_NombreFichero_AUX.Replace("\n", "");
                        str_NombreFichero_AUX = Regex.Replace(str_NombreFichero_AUX, @"[\/:?*""<>|]", "", RegexOptions.None);
                        if (str_NombreFichero_AUX.Trim().Length > 0)
                        {
                            str_NombreFichero = str_NombreFichero_AUX;
                        }
                        else
                        {
                            str_NombreFichero = _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension;
                        }
                    }
                    else
                    {
                        str_NombreFichero = _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension;
                    }
                }
                else
                {
                    str_NombreFichero = _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Funciones_GestionDocumental) + "/" + nameof(Obtener_NombreFichero_Final));
            }
            finally
            {
                if (obj_PdfReader != null)
                {
                    obj_PdfReader.Close();
                }
            }

            return str_NombreFichero;
        }

    }
}
