using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Linq;
using Exferia_KairosPRO._1_Modelos;
using Exferia_Controles;

namespace Exferia_KairosPRO._4_Vistas
{
    public partial class PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia : Exferia_Formularios.P_Base
    {
        #region Variables privadas
        private DateTime g_dtt_FechaSeleccionada;
        private string g_str_Empresa = "";
        private string g_str_Departamento = "";
        private long? g_lng_idDepartamento = null;
        private List<KRS_DiasFestivos> g_lst_KRS_DiasFestivos = null;
        private List<INTERNO_KRS_Empleados_Modelo> g_lst_INTERNO_KRS_Empleados_Modelo = null;
        private List<KRS_AusenciasProgramadas> g_lst_KRS_AusenciasProgramadas = null;
        private List<KRS_PresenciasProgramadas> g_lst_KRS_PresenciasProgramadas = null;
        private List<INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo> g_lst_INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo = null;

        #endregion

        #region Constructor
        public PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia(DateTime _dtt_FechaSeleccionada,
                                                                            string _str_Empresa,
                                                                            string _str_Departamento,
                                                                            long? _lng_idDepartamento,
                                                                            List<KRS_DiasFestivos> _lst_KRS_DiasFestivos,
                                                                            List<INTERNO_KRS_Empleados_Modelo> _lst_INTERNO_KRS_Empleados_Modelo,
                                                                            List<KRS_AusenciasProgramadas> _lst_KRS_AusenciasProgramadas,
                                                                            List<KRS_PresenciasProgramadas> _lst_KRS_PresenciasProgramadas,
                                                                            List<INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo> _lst_INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo)
        {
            InitializeComponent();

            //Variables Recibidas
            g_dtt_FechaSeleccionada = _dtt_FechaSeleccionada;
            g_str_Empresa = _str_Empresa;
            g_str_Departamento = _str_Departamento;
            g_lng_idDepartamento = _lng_idDepartamento;
            g_lst_KRS_DiasFestivos = _lst_KRS_DiasFestivos;
            g_lst_INTERNO_KRS_Empleados_Modelo = _lst_INTERNO_KRS_Empleados_Modelo;
            g_lst_KRS_AusenciasProgramadas = _lst_KRS_AusenciasProgramadas;
            g_lst_KRS_PresenciasProgramadas = _lst_KRS_PresenciasProgramadas;
            g_lst_INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo = _lst_INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo;

            Cargar();

            Repintar.Empezar(this);
        }
        #endregion


        #region Cargar
        private void Cargar()
        {
            try
            {
                //Empresa/departamento
                ex_lbl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_EmpresaDepartamento.Text = g_str_Empresa.Trim().Length > 0 ? g_str_Empresa : g_str_Departamento;

                //fecha
                ex_lbl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Fecha.Text = "Fecha: " + g_dtt_FechaSeleccionada.ToString("dd/MM/yyyy");

                //Dias Festivos
                if (g_lst_KRS_DiasFestivos!=null && g_lst_KRS_DiasFestivos.Count>0)
                {
                    KRS_DiasFestivos mdl_KRS_DiasFestivos= g_lst_KRS_DiasFestivos.Where(m => m.fechaDesde <= g_dtt_FechaSeleccionada && m.fechaHasta >= g_dtt_FechaSeleccionada).FirstOrDefault();
                    if (mdl_KRS_DiasFestivos!=null)
                    {
                        ex_lbl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_DiaFestivo.Text="Día festivo: " +  mdl_KRS_DiasFestivos.descripcion;
                    }
                }

                int int_AnchoDescripcion = 100;
                int int_AnchoTotal = 50;
                int int_AltoLabel = 18;
                int int_Posicion_X = 5;
                int int_Posicion_Y = 5;

                #region Total Empleados
                int int_TotalEmpleados = 0;
                if (g_lst_INTERNO_KRS_Empleados_Modelo!=null  && g_lst_INTERNO_KRS_Empleados_Modelo.Count>0)
                {
                    //por Departmannto
                    if (g_lng_idDepartamento!=null)
                    {
                        int_TotalEmpleados = g_lst_INTERNO_KRS_Empleados_Modelo.Where(m=>m.fechaBorrado==null && (m.fechaBaja==null || (m.fechaBaja!=null && m.fechaBaja>g_dtt_FechaSeleccionada)) && m.idDepartamento!=null && m.idDepartamento.Value.Equals(g_lng_idDepartamento.Value)).Count();
                    }
                    else
                    {
                        int_TotalEmpleados=g_lst_INTERNO_KRS_Empleados_Modelo.Where(m => m.fechaBorrado == null && (m.fechaBaja == null || (m.fechaBaja != null && m.fechaBaja > g_dtt_FechaSeleccionada))).Count();
                    }
                }

                //Descripcion
                Exferia_Label ex_lbl_descripcion = new Exferia_Label();
                ex_lbl_descripcion.Text = "PERSONAL";
                ex_lbl_descripcion.Size = new Size(int_AnchoDescripcion, int_AltoLabel);
                ex_lbl_descripcion.Location = new Point(int_Posicion_X,int_Posicion_Y);

                //Añadir al panel
                pnl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Resumen.Controls.Add(ex_lbl_descripcion);

                //Total
                Exferia_Label_SinColor ex_lbl_Total = new Exferia_Label_SinColor();
                ex_lbl_Total.Text = int_TotalEmpleados.ToString();
                ex_lbl_Total.Size = new Size(int_AnchoTotal, int_AltoLabel);
                ex_lbl_Total.Location = new Point(int_Posicion_X + 5 + int_AnchoDescripcion, int_Posicion_Y);

                //Añadir al panel
                pnl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Resumen.Controls.Add(ex_lbl_Total);

                int_Posicion_Y += int_AltoLabel;

                #endregion

                #region Total Ausencias
                if (g_lst_KRS_AusenciasProgramadas != null && g_lst_KRS_AusenciasProgramadas.Count > 0)
                {

                   var lst_Ausencias_Agrupadas= g_lst_KRS_AusenciasProgramadas.Where(m => m.fechaDesde <= g_dtt_FechaSeleccionada && (m.fechaHasta == null || (m.fechaHasta != null && m.fechaHasta.Value >= g_dtt_FechaSeleccionada)))
                                                              .GroupBy(m => new { m.idAusenciaProgramadaTipo, m.KRS_AusenciasProgramadasTipos.descripcion })
                                                              .Select(m => new { m.Key.descripcion, total=m.Count() }).ToList();

                    if (lst_Ausencias_Agrupadas!=null && lst_Ausencias_Agrupadas.Count>0)
                    {
                        foreach (var obj_Ausencias in lst_Ausencias_Agrupadas)
                        {
                            //Descripcion
                            Exferia_Label ex_lbl_descripcion_Ausencias = new Exferia_Label();
                            ex_lbl_descripcion_Ausencias.Text = obj_Ausencias.descripcion.ToUpper();
                            ex_lbl_descripcion_Ausencias.Size = new Size(int_AnchoDescripcion, int_AltoLabel);
                            ex_lbl_descripcion_Ausencias.Location = new Point(int_Posicion_X, int_Posicion_Y);

                            //Añadir al panel
                            pnl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Resumen.Controls.Add(ex_lbl_descripcion_Ausencias);

                            //Total
                            Exferia_Label_SinColor ex_lbl_Total_Ausencias = new Exferia_Label_SinColor();
                            ex_lbl_Total_Ausencias.Text = obj_Ausencias.total.ToString();
                            ex_lbl_Total_Ausencias.Size = new Size(int_AnchoTotal, int_AltoLabel);
                            ex_lbl_Total_Ausencias.Location = new Point(int_Posicion_X + 5 + int_AnchoDescripcion, int_Posicion_Y);

                            //Añadir al panel
                            pnl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Resumen.Controls.Add(ex_lbl_Total_Ausencias);

                            int_Posicion_Y += int_AltoLabel;
                        }
                    }
                }

                #endregion


                #region Disponibles
                int int_TotalEmpleados_Disponibles = 0;

                //1º Presencia programada
                int int_Empleados_Presencias = 0;
                if (g_lst_KRS_PresenciasProgramadas != null && g_lst_KRS_PresenciasProgramadas.Count > 0)
                {
                    int_Empleados_Presencias = g_lst_KRS_PresenciasProgramadas.Where(m =>
                                                                                        m.fechaDesde <= g_dtt_FechaSeleccionada &&
                                                                                        m.fechaHasta >= g_dtt_FechaSeleccionada &&
                                                                                        (m.KRS_Empleados.fechaBaja == null ||
                                                                                            (m.KRS_Empleados.fechaBaja != null && m.KRS_Empleados.fechaBaja.Value > g_dtt_FechaSeleccionada)
                                                                                        )
                                                                                        )
                                                                                .Select(m => m.idEmpleado)
                                                                                .Distinct()
                                                                                .Count();
                }

                //2º Ausencia Programada
                int int_Empleados_Ausencias = 0;
                if (g_lst_KRS_AusenciasProgramadas != null && g_lst_KRS_AusenciasProgramadas.Count > 0)
                {
                    int_Empleados_Ausencias = g_lst_KRS_AusenciasProgramadas.Where(m =>
                                                                                        m.fechaDesde <= g_dtt_FechaSeleccionada &&
                                                                                        (
                                                                                            m.fechaHasta == null ||
                                                                                            (m.fechaHasta != null &&
                                                                                             m.fechaHasta.Value >= g_dtt_FechaSeleccionada)
                                                                                        ) &&
                                                                                        (m.KRS_Empleados.fechaBaja == null ||
                                                                                            (m.KRS_Empleados.fechaBaja != null && m.KRS_Empleados.fechaBaja.Value > g_dtt_FechaSeleccionada)
                                                                                        )
                                                                                        )
                                                                                .Select(m => m.idEmpleado)
                                                                                .Distinct()
                                                                                .Count();
                }

                //3º Jornada
                int int_Empleados_Jornada = 0;
                if (g_lst_INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo != null && g_lst_INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo.Count > 0)
                {
                    int_Empleados_Jornada = g_lst_INTERNO_AUX_PerfilesLineaSolicitudesAusencias_Modelo.Where(m =>
                                                                                                                m.FechaDesde <= g_dtt_FechaSeleccionada &&
                                                                                                                m.FechaHasta >= g_dtt_FechaSeleccionada &&
                                                                                                                (m.FechaBajaEmpleado == null ||
                                                                                                                   (m.FechaBajaEmpleado != null && m.FechaBajaEmpleado.Value > g_dtt_FechaSeleccionada)
                                                                                                                )
                                                                                                              )
                                                                                                       .Select(m => m.IdEmpleado)
                                                                                                       .Distinct()
                                                                                                       .Count();
                }

                if ((int_Empleados_Jornada + int_Empleados_Presencias) == 0)
                {
                    int_TotalEmpleados_Disponibles = 0;
                }
                else
                {
                    int_TotalEmpleados_Disponibles=((int_Empleados_Jornada + int_Empleados_Presencias) - int_Empleados_Ausencias);
                }


                #region Disponible
                Exferia_Label ex_lbl_descripcion_Disponible = new Exferia_Label();
                ex_lbl_descripcion_Disponible.Text = "DISPONIBLE";
                ex_lbl_descripcion_Disponible.Size = new Size(int_AnchoDescripcion, int_AltoLabel);
                ex_lbl_descripcion_Disponible.Location = new Point(int_Posicion_X, int_Posicion_Y);

                //Añadir al panel
                pnl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Resumen.Controls.Add(ex_lbl_descripcion_Disponible);

                //Total
                Exferia_Label_SinColor ex_lbl_Total_Disponible = new Exferia_Label_SinColor();
                ex_lbl_Total_Disponible.Text = int_TotalEmpleados_Disponibles.ToString();
                ex_lbl_Total_Disponible.Size = new Size(int_AnchoTotal, int_AltoLabel);
                ex_lbl_Total_Disponible.Location = new Point(int_Posicion_X + 5 + int_AnchoDescripcion, int_Posicion_Y);

                //Añadir al panel
                pnl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Resumen.Controls.Add(ex_lbl_Total_Disponible);

                int_Posicion_Y += int_AltoLabel;
                #endregion

                #region SinJornada
                Exferia_Label ex_lbl_descripcion_SinJornada = new Exferia_Label();
                ex_lbl_descripcion_SinJornada.Text = "SIN JORNADA";
                ex_lbl_descripcion_SinJornada.Size = new Size(int_AnchoDescripcion, int_AltoLabel);
                ex_lbl_descripcion_SinJornada.Location = new Point(int_Posicion_X, int_Posicion_Y);

                //Añadir al panel
                pnl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Resumen.Controls.Add(ex_lbl_descripcion_SinJornada);

                //Total
                Exferia_Label_SinColor ex_lbl_Total_SinJornada = new Exferia_Label_SinColor();
                ex_lbl_Total_SinJornada.Text = (int_TotalEmpleados - (int_TotalEmpleados_Disponibles + int_Empleados_Ausencias)).ToString();
                ex_lbl_Total_SinJornada.Size = new Size(int_AnchoTotal, int_AltoLabel);
                ex_lbl_Total_SinJornada.Location = new Point(int_Posicion_X + 5 + int_AnchoDescripcion, int_Posicion_Y);

                //Añadir al panel
                pnl_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia_Resumen.Controls.Add(ex_lbl_Total_SinJornada);

                int_Posicion_Y += int_AltoLabel;
                #endregion


                #endregion


                this.Size = new Size(this.Size.Width, this.Size.Height + int_Posicion_Y);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Cargar) + "" + nameof(PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia));
            }
        }
        #endregion
    }
}
