using Exferia_Aplicacion.General;
using Exferia_KairosPRO._1_Modelos;
using Exferia_KairosPRO._2_Datos;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exferia_KairosPRO.General
{
    public class Verificacion_DetalleFichaje_PorFecha
    {
        #region Variables privadas
        private TMP_Emails_Informes_PorFechas_Datos g_obj_TMP_Emails_Informes_PorFechas_Datos = new TMP_Emails_Informes_PorFechas_Datos();
        private long g_lng_CodigoCliente =-1;
        private DateTime g_dtt_Validacion ;
        private bool g_bol_Grabar_Diccionarios_XML = false;
        #endregion

        public void Proceso(long _lng_CodigoCliente, DateTime _dtt_Validacion, bool _bol_Grabar_Diccionarios_XML)
        {
            try
            {
                g_lng_CodigoCliente = _lng_CodigoCliente;
                g_dtt_Validacion= _dtt_Validacion;
                g_bol_Grabar_Diccionarios_XML = _bol_Grabar_Diccionarios_XML;

                //Si estuviera a nulo el diccionario
                if (Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS == null)
                {
                    Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS.Add(g_lng_CodigoCliente, new List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo>());
                }
                //Si tuviera valores pero no para este cliente
                else if (!Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS.ContainsKey(g_lng_CodigoCliente))
                {
                    Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS.Add(g_lng_CodigoCliente,new List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo>());
                }

                //Empezar a validar los dias que tengo que enviar los informes .................................................................................................................
                DateTime dtt_Fecha_SinHoras = new DateTime(_dtt_Validacion.Year, _dtt_Validacion.Month, _dtt_Validacion.Day);

                List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo> lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo = Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS[_lng_CodigoCliente];

                //Para el Informe Diario, tiene que ser todos los dias, despues de las 12 de la noche, (00:00)
                if (_dtt_Validacion.Hour >= 00)
                {
                    Diario(dtt_Fecha_SinHoras.AddDays(-1), lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo);
                }

                //Para el Informe Semanal, tiene que ser todos lunes, despues de las 12 de la noche, (00:00)
                if (_dtt_Validacion.DayOfWeek == DayOfWeek.Monday && _dtt_Validacion.Hour >= 00)
                {
                    Semanal(dtt_Fecha_SinHoras, lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo);
                }

                //Para el Informe Mensual, tiene que ser todos dia 1, despues de las 12 de la noche, (00:00)
                if (_dtt_Validacion.Day == 1 && _dtt_Validacion.Hour >= 00)
                {
                    Mensual(dtt_Fecha_SinHoras, lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo);
                }

                //Para el Informe Mensual de Total Dispositivos, tiene que ser 2 dias antes del fin del mes, despues de las 12 de la noche (00:00)
                if(_dtt_Validacion.Day == (DateTime.DaysInMonth(_dtt_Validacion.Year, _dtt_Validacion.Month)-2) && _dtt_Validacion.Hour >= 00)
                {
                    Mensual_TotalDispositivos_2DiasAntes(dtt_Fecha_SinHoras, lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo);
                }

                //Para el Informe Mensual de Total Dispositivos, tiene que ser todos los dias 1, despues de las 12 de la noche (00:00)
                if (_dtt_Validacion.Day == 1 && _dtt_Validacion.Hour >= 00)
                {
                    Mensual_TotalDispositivos(dtt_Fecha_SinHoras, lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo);
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_DetalleFichaje_PorFecha) + "/" + nameof(Proceso));
            }
        }

        private void Diario(DateTime _dtt_Fecha_SinHoras, List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo> _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo)
        {
            try
            {
                INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_DIARIO = null;
                if (_lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo != null && _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Count > 0)
                {
                    mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_DIARIO = _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Where(m => m.IdInformeTipo.Equals(Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_DIARIO.Id) && m.Fecha.Equals(_dtt_Fecha_SinHoras)).FirstOrDefault();
                }

                //Si esta a nulo, se tiene que enviar el informe del Diario
                if (mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_DIARIO == null)
                {
                    //Agregar para Enviar por Email
                    TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas = new TMP_Emails_Informes_PorFechas();
                    mdl_TMP_Emails_Informes_PorFechas.codigoCliente = g_lng_CodigoCliente;
                    mdl_TMP_Emails_Informes_PorFechas.idInformeTipo = Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_DIARIO.Id;
                    mdl_TMP_Emails_Informes_PorFechas.fechaDesde = _dtt_Fecha_SinHoras;
                    mdl_TMP_Emails_Informes_PorFechas.fechaHasta = _dtt_Fecha_SinHoras.AddHours(23).AddMinutes(59);

                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Insertar(mdl_TMP_Emails_Informes_PorFechas);

                    //Se agrega en el Diccionario para no volver a utilizarr este dia
                    Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_Informes_PorFechas(g_lng_CodigoCliente, _dtt_Fecha_SinHoras, Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_DIARIO.Id, g_bol_Grabar_Diccionarios_XML);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_DetalleFichaje_PorFecha) + "/" + nameof(Diario));
            }
        }

        private void Semanal(DateTime _dtt_Fecha_SinHoras, List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo> _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo)
        {
            try
            {
                INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_SEMANAL = null;
                if (_lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo != null && _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Count > 0)
                {
                    mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_SEMANAL = _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Where(m => m.IdInformeTipo.Equals(Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_SEMANAL.Id) && m.Fecha.Equals(_dtt_Fecha_SinHoras)).FirstOrDefault();
                }

                //Si esta a nulo, se tiene que enviar el informe del Semanal
                if (mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_SEMANAL == null)
                {
                    //Agregar para Enviar por Email
                    TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas = new TMP_Emails_Informes_PorFechas();
                    mdl_TMP_Emails_Informes_PorFechas.codigoCliente = g_lng_CodigoCliente;
                    mdl_TMP_Emails_Informes_PorFechas.idInformeTipo = Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_SEMANAL.Id;
                    mdl_TMP_Emails_Informes_PorFechas.fechaDesde = _dtt_Fecha_SinHoras.AddDays(-7);
                    mdl_TMP_Emails_Informes_PorFechas.fechaHasta = _dtt_Fecha_SinHoras.AddMinutes(-1);

                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Insertar(mdl_TMP_Emails_Informes_PorFechas);

                    //Se agrega en el Diccionario para no volver a utilizarr este dia
                    Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_Informes_PorFechas(g_lng_CodigoCliente, _dtt_Fecha_SinHoras, Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_SEMANAL.Id, g_bol_Grabar_Diccionarios_XML);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_DetalleFichaje_PorFecha) + "/" + nameof(Semanal));
            }
        }

        private void Mensual(DateTime _dtt_Fecha_SinHoras, List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo> _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo)
        {
            try
            {
                INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL = null;
                if (_lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo != null && _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Count > 0)
                {
                    mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL = _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Where(m => m.IdInformeTipo.Equals(Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_MENSUAL.Id) && m.Fecha.Equals(_dtt_Fecha_SinHoras)).FirstOrDefault();
                }

                //Si esta a nulo, se tiene que enviar el informe del Diario
                if (mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL == null)
                {
                    //Agregar para Enviar por Email
                    TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas = new TMP_Emails_Informes_PorFechas();
                    mdl_TMP_Emails_Informes_PorFechas.codigoCliente = g_lng_CodigoCliente;
                    mdl_TMP_Emails_Informes_PorFechas.idInformeTipo = Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_MENSUAL.Id;
                    mdl_TMP_Emails_Informes_PorFechas.fechaDesde = _dtt_Fecha_SinHoras.AddMonths(-1);
                    mdl_TMP_Emails_Informes_PorFechas.fechaHasta = _dtt_Fecha_SinHoras.AddMinutes(-1);

                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Insertar(mdl_TMP_Emails_Informes_PorFechas);

                    //Se agrega en el Diccionario para no volver a utilizar este dia
                    Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_Informes_PorFechas(g_lng_CodigoCliente, _dtt_Fecha_SinHoras, Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_MENSUAL.Id, g_bol_Grabar_Diccionarios_XML);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_DetalleFichaje_PorFecha) + "/" + nameof(Mensual));
            }
        }

        private void Mensual_TotalDispositivos(DateTime _dtt_Fecha_SinHoras, List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo> _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo)
        {
            try
            {
                INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL_DISPOSITIVOS = null;
                if(_lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo != null && _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Count > 0)
                {
                    mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL_DISPOSITIVOS = _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Where(m => m.IdInformeTipo.Equals(Variables.G_MDL_INFORMES_KAIROSPRO_FICHAJE_MENSUAL_TOTALDISPOSITIVOS.Id) && m.Fecha.Equals(_dtt_Fecha_SinHoras)).FirstOrDefault();
                }

                //Si no esta nulo, se tiene que enviar el informe del Diario
                if(mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL_DISPOSITIVOS == null)
                {
                    //Agregar para Enviar por Email
                    TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas = new TMP_Emails_Informes_PorFechas();
                    mdl_TMP_Emails_Informes_PorFechas.codigoCliente = g_lng_CodigoCliente;
                    mdl_TMP_Emails_Informes_PorFechas.idInformeTipo = Variables.G_MDL_INFORMES_KAIROSPRO_FICHAJE_MENSUAL_TOTALDISPOSITIVOS.Id;
                    mdl_TMP_Emails_Informes_PorFechas.fechaDesde = _dtt_Fecha_SinHoras.AddMonths(-1);
                    mdl_TMP_Emails_Informes_PorFechas.fechaHasta = _dtt_Fecha_SinHoras.AddMinutes(-1);

                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Insertar(mdl_TMP_Emails_Informes_PorFechas);

                    //Se agrega en el Diccionario para no volver a utilizar este dia
                    Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_Informes_PorFechas(g_lng_CodigoCliente, _dtt_Fecha_SinHoras, Variables.G_MDL_INFORMES_KAIROSPRO_FICHAJE_MENSUAL_TOTALDISPOSITIVOS.Id, g_bol_Grabar_Diccionarios_XML);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_DetalleFichaje_PorFecha) + "/" + nameof(Mensual_TotalDispositivos));
            }
        }

        private void Mensual_TotalDispositivos_2DiasAntes(DateTime _dtt_Fecha_SinHoras, List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo> _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo)
        {
            try
            {
                INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL_DISPOSITIVOS = null;
                if (_lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo != null && _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Count > 0)
                {
                    mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL_DISPOSITIVOS = _lst_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo.Where(m => m.IdInformeTipo.Equals(Variables.G_MDL_INFORMES_KAIROSPRO_FICHAJE_MENSUALDOSDIASANTES_TOTALDISPOSITIVOS.Id) && m.Fecha.Equals(_dtt_Fecha_SinHoras)).FirstOrDefault();
                }

                //Si no esta nulo, se tiene que enviar el informe del Diario
                if (mdl_INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo_MENSUAL_DISPOSITIVOS == null)
                {
                    //Agregar para Enviar por Email
                    TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas = new TMP_Emails_Informes_PorFechas();
                    mdl_TMP_Emails_Informes_PorFechas.codigoCliente = g_lng_CodigoCliente;
                    mdl_TMP_Emails_Informes_PorFechas.idInformeTipo = Variables.G_MDL_INFORMES_KAIROSPRO_FICHAJE_MENSUAL_TOTALDISPOSITIVOS.Id;
                    mdl_TMP_Emails_Informes_PorFechas.fechaDesde = _dtt_Fecha_SinHoras.AddMonths(-1);
                    mdl_TMP_Emails_Informes_PorFechas.fechaHasta = _dtt_Fecha_SinHoras.AddMinutes(-1);

                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Insertar(mdl_TMP_Emails_Informes_PorFechas);

                    //Se agrega en el Diccionario para no volver a utilizar este dia
                    Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_Informes_PorFechas(g_lng_CodigoCliente, _dtt_Fecha_SinHoras, Variables.G_MDL_INFORMES_KAIROSPRO_FICHAJE_MENSUALDOSDIASANTES_TOTALDISPOSITIVOS.Id, g_bol_Grabar_Diccionarios_XML);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_DetalleFichaje_PorFecha) + "/" + nameof(Mensual_TotalDispositivos_2DiasAntes));
            }
        }
    }
}
