using Exferia_Aplicacion.General;
using Exferia_Formularios;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Exferia_GestionDocumental.General
{
    public class PDF24
    {
        private static PE_Esperando g_frm_PE_Esperando = null;


        public static string G_STR_NOMBREAPLICACION = "pdf24";
        public static string G_STR_NOMBREAPLICACION_OCR = "pdf24-Ocr.exe";
        public static string G_STR_NOMBREAPLICACION_DOCTOOL = "pdf24-DocTool.exe";

        #region Convertir A PDFA Asincrono
        public static void Convertir_A_PDFA_Asincrono(string _str_Fichero_Origen, string _str_Fichero_Destino, bool _bol_SaltarPaginasConTexto)
        {
            try
            {
                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                BackgroundWorker obj_TareaAsincrona_Convertir_A_PDFA = new BackgroundWorker();
                obj_TareaAsincrona_Convertir_A_PDFA.DoWork += new DoWorkEventHandler(TareaAsincrona_Convertir_A_PDFA_DoWork);
                obj_TareaAsincrona_Convertir_A_PDFA.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Convertir_A_PDFA_Completed);
                obj_TareaAsincrona_Convertir_A_PDFA.WorkerReportsProgress = false;


                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_Fichero_Origen);
                lst_Argumentos.Add(_str_Fichero_Destino);
                lst_Argumentos.Add(_bol_SaltarPaginasConTexto);

                //(Tarea Asincrona)  ##################################################################
                obj_TareaAsincrona_Convertir_A_PDFA.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;
                }

                throw new Control_Errores("", ex, nameof(PDF24) + "/" + nameof(Convertir_A_PDFA_Asincrono), true);
            }
        }
        private static void TareaAsincrona_Convertir_A_PDFA_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Fichero_Origen = (string)lst_Argumentos[0];
                string str_Fichero_Destino = (string)lst_Argumentos[1];
                bool bol_SaltarPaginasConTexto = (bool)lst_Argumentos[2];

                //Tamaño del Fichero
                FileInfo obj_FileInfo = new FileInfo(str_Fichero_Origen);
                long lng_TamanoFicheroOrigen = obj_FileInfo.Length/1024;

                // Proceso de actualización
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                ProcessStartInfo obj_ProcessStartInfo = new ProcessStartInfo();
                obj_ProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

                //Se quita para que no se dupliquen los datos
                string str_skipPagesWithText = "";
                if (bol_SaltarPaginasConTexto)
                {
                    str_skipPagesWithText = "-skipPagesWithText";
                }

                //-skipPagesWithText
                obj_ProcessStartInfo.Arguments = @"-outputFile " + str_Fichero_Destino + " -language spa -applyProfile -profile user/" + Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_Perfil + " " + str_skipPagesWithText + " -dpi " + Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_Resolucion + " -deskew " + str_Fichero_Origen;
                obj_ProcessStartInfo.FileName = Variables_GestionDocumental.G_STR_RUTA_APLICACION_EXTERNA_PDF24 + @"\" + G_STR_NOMBREAPLICACION_OCR;

                process.StartInfo = obj_ProcessStartInfo;
                process.Start();

                //Esperar un tiempo prederterminado
                int int_Contador_Segundos = 0;
                long lng_TiempoMaximoCalculado = (Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_TiempoMaximoPorMega.Value * lng_TamanoFicheroOrigen) / 1024;
                while (!File.Exists(str_Fichero_Destino))
                {
                    Thread.Sleep(1000);
                    Application.DoEvents();
                    Application.DoEvents();
                    int_Contador_Segundos += 1;

                    if (lng_TiempoMaximoCalculado <= int_Contador_Segundos)
                    {
                        break;
                    }
                }

                if (!process.HasExited)
                {
                    process.CloseMainWindow();
                }

                Thread.Sleep(2000);
                Application.DoEvents();
                Application.DoEvents();

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(PDF24) + "/" + nameof(TareaAsincrona_Convertir_A_PDFA_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(PDF24) + "/" + nameof(TareaAsincrona_Convertir_A_PDFA_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private static void TareaAsincrona_Convertir_A_PDFA_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
        }
        #endregion
        public static void Convertir_A_PDFA(byte[] _arr_Fichero_Origen, string _str_Fichero_Destino, bool _bol_SaltarPaginasConTexto)
        {
            string str_FicheroTemporal = "";

            try
            {
                //Grabar el Fichero de Origen en una ruta Temporal
                str_FicheroTemporal = Path.GetTempPath() + DateTime.Now.ToString("yyyyMMddHHmmss") + "_FicheroAlmacenar.pdf";
                File.WriteAllBytes(str_FicheroTemporal, _arr_Fichero_Origen);

                //Tamaño del Fichero
                long lng_TamanoFicheroOrigen = _arr_Fichero_Origen.Length / 1024;

                //Se quita para que no se dupliquen los datos
                string str_skipPagesWithText = "";
                if (_bol_SaltarPaginasConTexto)
                {
                    str_skipPagesWithText = "-skipPagesWithText";
                }

                // Proceso de actualización
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                ProcessStartInfo obj_ProcessStartInfo = new ProcessStartInfo();
                obj_ProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;

                obj_ProcessStartInfo.Arguments = @"-outputFile " + _str_Fichero_Destino + " -language spa -applyProfile -profile user/" + Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_Perfil + " " + str_skipPagesWithText + " -dpi " + Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_Resolucion + " -deskew " + str_FicheroTemporal;
                obj_ProcessStartInfo.FileName = Variables_GestionDocumental.G_STR_RUTA_APLICACION_EXTERNA_PDF24 + @"\" + G_STR_NOMBREAPLICACION_OCR;
              
                process.StartInfo = obj_ProcessStartInfo;
                process.Start();

                //Esperar un tiempo prederterminado
                int int_Contador_Segundos = 0;
                long lng_TiempoMaximoCalculado = (Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_TiempoMaximoPorMega.Value * lng_TamanoFicheroOrigen) / 1024;
                while (!File.Exists(_str_Fichero_Destino))
                {
                    Thread.Sleep(1000);
                    Application.DoEvents();
                    Application.DoEvents();
                    int_Contador_Segundos += 1;

                    if (lng_TiempoMaximoCalculado <= int_Contador_Segundos)
                    {
                        break;
                    }
                }

                if (!process.HasExited)
                {
                    process.CloseMainWindow();
                }

                Thread.Sleep(2000);
                Application.DoEvents();
                Application.DoEvents();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(PDF24) + "/" + nameof(Convertir_A_PDFA), true);
            }
            finally
            {
                try
                {
                    File.Delete(str_FicheroTemporal);
                }
                catch (Exception)
                { }
            }
        }

        #region Convertir A PDF Asincrono
        public static void Convertir_A_PDF_Asincrono(string _str_Fichero_Origen, string _str_Fichero_Destino)
        {
            try
            {
                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                BackgroundWorker obj_TareaAsincrona_Convertir_A_PDF = new BackgroundWorker();
                obj_TareaAsincrona_Convertir_A_PDF.DoWork += new DoWorkEventHandler(TareaAsincrona_Convertir_A_PDF_DoWork);
                obj_TareaAsincrona_Convertir_A_PDF.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Convertir_A_PDF_Completed);
                obj_TareaAsincrona_Convertir_A_PDF.WorkerReportsProgress = false;


                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_Fichero_Origen);
                lst_Argumentos.Add(_str_Fichero_Destino);

                //(Tarea Asincrona)  ##################################################################
                obj_TareaAsincrona_Convertir_A_PDF.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;
                }

                throw new Control_Errores("", ex, nameof(PDF24) + "/" + nameof(Convertir_A_PDF_Asincrono), true);
            }
        }
        private static void TareaAsincrona_Convertir_A_PDF_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Fichero_Origen = (string)lst_Argumentos[0];
                string str_Fichero_Destino = (string)lst_Argumentos[1];

                //Tamaño del Fichero
                FileInfo obj_FileInfo = new FileInfo(str_Fichero_Origen);
                long lng_TamanoFicheroOrigen = obj_FileInfo.Length / 1024;

                // Proceso de actualización
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                ProcessStartInfo obj_ProcessStartInfo = new ProcessStartInfo();
                obj_ProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;

                obj_ProcessStartInfo.Arguments = @"-convertToPDF -noProgress -applyProfile -profile user/" + Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_Perfil + "  -dpi " + Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_Resolucion + " -outputFile " + str_Fichero_Destino + " " + str_Fichero_Origen;
                obj_ProcessStartInfo.FileName = Variables_GestionDocumental.G_STR_RUTA_APLICACION_EXTERNA_PDF24 + @"\" + G_STR_NOMBREAPLICACION_DOCTOOL;
                process.StartInfo = obj_ProcessStartInfo;
                process.Start();

                //Esperar un tiempo prederterminado
                int int_Contador_Segundos = 0;
                long lng_TiempoMaximoCalculado = (Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_TiempoMaximoPorMega.Value * lng_TamanoFicheroOrigen) / 1024;
                while (!File.Exists(str_Fichero_Destino))
                {
                    Thread.Sleep(1000);
                    Application.DoEvents();
                    Application.DoEvents();
                    int_Contador_Segundos += 1;

                    if (lng_TiempoMaximoCalculado <= int_Contador_Segundos)
                    {
                        break;
                    }
                }

                if (!process.HasExited)
                {
                    process.CloseMainWindow();
                }

                Thread.Sleep(2000);
                Application.DoEvents();
                Application.DoEvents();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(PDF24) + "/" + nameof(TareaAsincrona_Convertir_A_PDF_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(PDF24) + "/" + nameof(TareaAsincrona_Convertir_A_PDF_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private static void TareaAsincrona_Convertir_A_PDF_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
        }
        #endregion

        public static void Convertir_A_PDF(byte[] _arr_Fichero_Origen,string _str_ExtensionOrigen, string _str_Fichero_Destino)
        {
            string str_FicheroTemporal = "";

            try
            {
                //Grabar el Fichero de Origen en una ruta Temporal
                str_FicheroTemporal = Path.GetTempPath() + DateTime.Now.ToString("yyyyMMddHHmmss") + "_FicheroAlmacenar" + _str_ExtensionOrigen;
                File.WriteAllBytes(str_FicheroTemporal, _arr_Fichero_Origen);

                //Tamaño del Fichero
                long lng_TamanoFicheroOrigen = _arr_Fichero_Origen.Length / 1024;

                // Proceso de actualización
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                ProcessStartInfo obj_ProcessStartInfo = new ProcessStartInfo();
                obj_ProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;

                obj_ProcessStartInfo.Arguments = @"-convertToPDF -noProgress -applyProfile -profile user/" + Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_Perfil + "  -dpi " + Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_Resolucion + " -outputFile " + _str_Fichero_Destino + " " + str_FicheroTemporal;
                obj_ProcessStartInfo.FileName = Variables_GestionDocumental.G_STR_RUTA_APLICACION_EXTERNA_PDF24 + @"\" + G_STR_NOMBREAPLICACION_DOCTOOL;
                process.StartInfo = obj_ProcessStartInfo;
                process.Start();

                //Esperar un tiempo prederterminado
                int int_Contador_Segundos = 0;
                long lng_TiempoMaximoCalculado = (Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf24_TiempoMaximoPorMega.Value * lng_TamanoFicheroOrigen) / 1024;
                while (!File.Exists(_str_Fichero_Destino))
                {
                    Thread.Sleep(1000);
                    Application.DoEvents();
                    Application.DoEvents();
                    int_Contador_Segundos += 1;

                    if (lng_TiempoMaximoCalculado <= int_Contador_Segundos)
                    {
                        break;
                    }
                }

                if (!process.HasExited)
                {
                    process.CloseMainWindow();
                }


                Thread.Sleep(2000);
                Application.DoEvents();
                Application.DoEvents();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(PDF24) + "/" + nameof(Convertir_A_PDF), true);
            }
            finally
            {
                try
                {
                    File.Delete(str_FicheroTemporal);
                }
                catch (Exception)
                { }
            }
        }

    }

}
