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

namespace Narvaling.monitor.model
{
   
    public class monitor
    {
        private Thread t;
        private bool pirate;
        private int tiempoComprobacion;
        private int tiempoMensaje;
        public monitor()
        {
            tiempoComprobacion = int.Parse(ConfigurationManager.AppSettings["tiempoComprovacionPrime"]);
            tiempoMensaje = int.Parse(ConfigurationManager.AppSettings["tiempoNotificacion"]);
            if(tiempoComprobacion>0)
                t = new Thread(runMonitor);
            else
                t = null;
            
            pirate = false;
            
        }

        private static void runMonitor(object m)
        {

            ((monitor)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()
        {
            string aa = IdService.GetMEI();
            aa = aa;
            while (!pirate)
            {
                DateTime currentDate = DateTime.Now;
                //espera
                espera(tiempoComprobacion);
                if (pirate)
                    continue;

                //Thread.Sleep(tiempoComprobacion*1000);
                //revisa lan
                logService.log("Se comprueba Autorización");
                var res = ConectaSRV();

                if(res==1)
                {
                    logService.log("Pc autorizado");
                }
                else if(res<0)
                {
                    logService.log("Pc sin conexión");
                    //se intentara mas adelante
                }
                else
                {
                    logService.log("Pc sin autorizacion");
                    if (pirate)
                        continue;
                    //manda mensaje
                    NotificacionService.Notifica();
                    //espera despues de mensaje
                    //Thread.Sleep(tiempoMensaje*1000);
                    espera(tiempoMensaje);
                    if (pirate)
                        continue;
                    //apaga
                    logService.log("Se apaga maquina");
                    shutdownService.apagaPc();
                }
                if(res<0)
                    int.Parse(ConfigurationManager.AppSettings["tiempoComprovacionPrime"]);
                else
                    tiempoComprobacion = int.Parse(ConfigurationManager.AppSettings["tiempoComprovacion"]);

            }
        }

        private int ConectaSRV()
        {
            for (int i = 0; i < 3; i++)
            {
                if (pirate)
                    return -1;
                //intenta a srv lan
                var res= conexionService.ConectLanSRV();
                if( res<0)
                    espera(5);
                else
                {
                    return res;
                }
            }

            for (int i = 0; i < 3; i++)
            {
                if (pirate)
                    return -1;
                //intenta a srv lan
                var res = conexionService.ConectExternSRV();
                if (res < 0)
                    espera(5);
                else
                {
                    return res;
                }
            }
            return -1;
        }



        public void start()
        {
           
            if (t!=null &&!t.IsAlive)
            {
                pirate = false;
                t.Start(this);
            }

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

    
}
