using Narvaling.monitor.service;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Narvaling.monitor.model
{
   
    public class monitorNavegacion

    {
        private Thread t;
        private bool pirate;
        private int tiempoComprobacion;
        private bool reiniciaNavegador;
        public monitorNavegacion()
        {
            tiempoComprobacion = int.Parse(ConfigurationManager.AppSettings["tiempoComprovacionNavegador"]);
            reiniciaNavegador = true;
            if(tiempoComprobacion>0)
                t = new Thread(runMonitorNavegador);
            else
            {
                t = null;
            }
            pirate = false;
        }

        private static void runMonitorNavegador(object m)
        {

            ((monitorNavegacion)m).run();
        }
        private void espera(int nseg)
        {
            DateTime currentDate = DateTime.Now;
            //espera
            while (!pirate)
            {
                Thread.Sleep(1000);
                long elapsedTicks =  DateTime.Now.Ticks- currentDate.Ticks;
                TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
                if (elapsedSpan.TotalSeconds > nseg)
                    return;
            }
        }
        private void run()
        {
            logService.log("Se inicia monitor de navegador");
            while (!pirate)
            {
                DateTime currentDate = DateTime.Now;
                //espera
                espera(tiempoComprobacion);
                if (pirate)
                    continue;
                CompruebaNavegador();
            }
        }

        private void CompruebaNavegador()
        {
            if(IsNavRun())
            {
                reiniciaNavegador = true;
            }
            else if(reiniciaNavegador)
            {
                logService.log("Se ReiniciaNavegador");
                reiniciaNavegador = false;
                reiniciaNav();
            }
        }
        private void reiniciaNav()
        {
            borraDatosNavegacion();
            copiaPaths();
        }
        private bool IsNavRun()
        {
            var st = ConfigurationManager.AppSettings["NombreProcesosNavegador"];
            if (String.IsNullOrWhiteSpace(st)) 
                return false;
            var procesos=st.Split(';');
            var res = false;
            foreach(var p in procesos)
            {
                res = res || IsProceso(p);
                if (res)
                    break;
            }

            return res;
        }
        private bool IsProceso(string nombreProceso)
        {
            Process[] procesos = Process.GetProcessesByName(nombreProceso);

            return procesos.Length > 0;
        }
        private void borraDatosNavegacion()
        {
            var st = ConfigurationManager.AppSettings["CarpetasBorrarNavegacion"];
            if (String.IsNullOrWhiteSpace(st))
                return ;
            var carpetas = st.Split(';');
            foreach (var c in carpetas)
                borraPath(c);
        }
        private void borraPath(string path)
        {
            if(string.IsNullOrWhiteSpace(path))
                return ;
            try
            {
                if (Directory.Exists(path))
                    Directory.Delete(path, recursive: true);
                if (File.Exists(path))
                    File.Delete(path);
            }
            catch (Exception ex)
            {
            }
        }
        private void copiaPaths()
        {
            var st = ConfigurationManager.AppSettings["CarpetasCopiarNavegacion"];
            if (String.IsNullOrWhiteSpace(st))
                return;
            var carpetas = st.Split(';');
            foreach (var c in carpetas)
            {
                if (string.IsNullOrWhiteSpace(c))
                    continue;
                var dat=c.Split('?');
                if (dat.Length == 2)
                    copiaDir(dat[0], dat[1]);
            }
        }
        private void copiaDir(string origen, string destino)
        {
            Directory.CreateDirectory(destino);

            // Copiar archivos
            foreach (string archivo in Directory.GetFiles(origen))
            {
                string nombreArchivo = Path.GetFileName(archivo);
                string destinoArchivo = Path.Combine(destino, nombreArchivo);
                File.Copy(archivo, destinoArchivo, overwrite: true); // overwrite opcional
            }

            // Copiar subdirectorios recursivamente
            foreach (string subdir in Directory.GetDirectories(origen))
            {
                string nombreSubdir = Path.GetFileName(subdir);
                string destinoSubdir = Path.Combine(destino, nombreSubdir);
                copiaDir(subdir, destinoSubdir);
            }
        }
        public void start()
        {
           
            if (t!=null && !t.IsAlive)
            {
                pirate = false;
                t.Start(this);
            }

        }
        public void fin()
        {
            pirate = true;
            if(t != null)
                t.Join();
        }
    }

    
}
