using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_General;
using Exferia_KairosPRO._4_Vistas.Controladoras;
using Exferia_KairosPRO.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;
using System.Linq;
using Exferia_Formularios;

namespace Exferia_KairosPRO._4_Vistas
{
    public partial class P_ConsultaDetallada_PorEmpleado : Exferia_Formularios.P_Base_Mantenimientos
    {
        #region Variables Generales
        private P_ConsultaDetallada_PorEmpleado_Controladora g_obj_Controladora;

        public bool g_bol_ConstructorPantalla_Terminado_Correctamente = true;
        public PRV_OpcionesDetalle g_mdl_PRV_Opciones_Detalle = null;

        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo = null;

        //Consulta empleado
        public INTERNO_ConfiguracionPantalla_Modelo g_mdl_INTERNO_ConfiguracionPantalla_Modelo_CONSULTAEMPLEADO = null;

        //Timer Buscar
        private System.Windows.Forms.Timer g_timer_Buscar_Empleados = new System.Windows.Forms.Timer();
        #endregion

        #region Objetos en Pantalla
        //Exferia_CheckBox
        internal Exferia_CheckBox Exferia_CheckBox_DadoseBaja { get { return ex_chk_P_ConsultaDetallada_PorEmpleado_DadosDeBaja; } }
        internal Exferia_CheckBox Exferia_CheckBox_PalabraCompleta { get { return ex_chk_P_ConsultaDetallada_PorEmpleado_PalabraCompleta; } }
        internal Exferia_CheckBox Exferia_CheckBox_MayusculasMinusculas { get { return ex_chk_P_ConsultaDetallada_PorEmpleado_MayusculasMinusculas; } }

        //Exferia_DataGriView
        internal Exferia_DataGridView Exferia_DataGridView_Empleados { get { return ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados; } }

        //Exferia_FechaSeleccion
        internal Exferia_FechaSeleccion Exferia_FechaSeleccion_FechaInicio { get { return ex_usc_P_ConsultaDetallada_PorEmpleado_FechaInicio; } }
        internal Exferia_FechaSeleccion Exferia_FechaSeleccion_FechaFin { get { return ex_usc_P_ConsultaDetallada_PorEmpleado_FechaFin; } }

        //Exferia_Label
        internal Exferia_Label Exferia_Label_HoraInicio { get { return ex_lbl_P_ConsultaDetallada_PorEmpleado_HoraInicio; } }
        internal Exferia_Label Exferia_Label_HoraFin { get { return ex_lbl_P_ConsultaDetallada_PorEmpleado_HoraFin; } }

        //Exferia_TabControl
        internal Exferia_TabControl Exferia_TabControl_Empleados { get { return ex_tbc_P_ConsultaDetallada_PorEmpleado_Empleados; } }

        //Exferia_TextBox
        internal Exferia_TextBox Exferia_TextBox_Buscar { get { return ex_txt_P_ConsultaDetallada_PorEmpleado_Buscar; } }

        //Exferia_TextBox_ConMascara
        internal Exferia_TextBox_ConMascara Exferia_TextBox_ConMascara_HoraInicio { get { return ex_txt_P_ConsultaDetallada_PorEmpleado_HoraInicio; } }
        internal Exferia_TextBox_ConMascara Exferia_TextBox_ConMascara_HoraFin { get { return ex_txt_P_ConsultaDetallada_PorEmpleado_HoraFin; } }
        #endregion

        #region Constructor
        public P_ConsultaDetallada_PorEmpleado(INTERNO_ValoresGenerales_Modelo _mdl_INTERNO_ValoresGenerales_Modelo, DateTime _dtt_FechaTrabajo, PRV_OpcionesDetalle _mdl_PRV_OpcionesDetalle)
        {
            InitializeComponent();

            Repintar.Empezar(this);

            CheckForIllegalCrossThreadCalls = false;

            //Comrpobamos que el codigo cliente exista y este bien
            if (Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO.Equals(-1))
            {
                //Tendriamos que avisar y no dejar abrir la pantalla
                Mensajes.MostrarMensaje(Mensajes.G_STR_LICENCIA_VALIDACIONES_LICENCIANOESTAACTIVA);
            }

            //Empresa Seleccionada y fecha de trabajo
            P_Base_ValoresGenerales = _mdl_INTERNO_ValoresGenerales_Modelo;
            P_Base_FechaTrabajo = _dtt_FechaTrabajo;


            //Instanciar Controladora
            g_obj_Controladora = new P_ConsultaDetallada_PorEmpleado_Controladora(this);

            //Datos de Opciones detalle
            g_mdl_PRV_Opciones_Detalle = _mdl_PRV_OpcionesDetalle;

            //Buscar los Permisos
            g_lst_INTERNO_Permisos_Modelo = Datos_Generales.Permisos_Buscar(g_mdl_PRV_Opciones_Detalle.opcion);

            //Mirrar si hay que bloquear los controles, si solo puede ver los datos
            if ((P_Base_TipoAperturaPantalla != 0 && Datos_Generales.Permisos_Comprobar(g_mdl_PRV_Opciones_Detalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, false)) == false)
            {
                //Bloquear los controles
                SoloLectura.Empezar(this, true);
            }

            //Titulo de la Pantalla
            P_Base_TituloPantalla = g_mdl_PRV_Opciones_Detalle.descripcion_TituloMantenimiento;

            if (Variables.G_DCT_CONFIGURACIONPANTALLA != null && Variables.G_DCT_CONFIGURACIONPANTALLA.Count > 0)
            {
                //Listado Informe
                if (Variables.G_DCT_CONFIGURACIONPANTALLA.ContainsKey(g_obj_Controladora.g_obj_ABS_Listado_ConsultaDetallada_PorEmpleado.NOMBRELISTADO_ALMACENARCONFIGURACION()))
                {
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_CONSULTAEMPLEADO = Variables.G_DCT_CONFIGURACIONPANTALLA[g_obj_Controladora.g_obj_ABS_Listado_ConsultaDetallada_PorEmpleado.NOMBRELISTADO_ALMACENARCONFIGURACION()];
                }
            }

            try
            {
                //Label con Empresa Seleccionada
                if (P_Base_ValoresGenerales != null)
                {
                    try
                    {
                        P_Base_Mantenimientos_InformacionEmpresaSeleccionada = P_Base_ValoresGenerales.str_Empresa_Descripcion + " - " +
                                                                "(" + P_Base_FechaTrabajo.ToString("dd/MM/yyyy") + ")";
                    }
                    catch (Exception ex)
                    {
                        //No se muestra mensaje pero se guarda en el log
                        Control_Errores.Errores_Log("", ex, nameof(P_ConsultaDetallada_PorEmpleado) + "/" + nameof(P_ConsultaDetallada_PorEmpleado));
                    }
                }
                //..................................................................................................................................

                //Bloquear pantalla hasta que termine la carga por defecto.....
                Enabled = false;
                //.............................................................

            }
            catch (Control_Errores)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
            catch (Exception ex)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;

                Control_Errores.Errores_Log("", ex, nameof(P_ConsultaDetallada_PorEmpleado) + "/" + nameof(P_ConsultaDetallada_PorEmpleado));
            }
            finally
            {
                //Bloquear pantalla hasta que termine la carga por defecto .............
                Enabled = true;
                //......................................................................
            }
        }
        #endregion

        #region Inicio de pantalla
        private void P_ConsultaDetallada_PorEmpleado_Load(object sender, EventArgs e)
        {
            try
            {
                //Configurar el Timer para Busqueda en el Listado #####################################################
                g_timer_Buscar_Empleados.Interval = 1000;
                g_timer_Buscar_Empleados.Tick += delegate (object s, EventArgs ee)
                {
                    g_timer_Buscar_Empleados.Stop();
                    g_obj_Controladora.Rellenar_DataGrid_Empleados(ex_txt_P_ConsultaDetallada_PorEmpleado_Buscar.Text);
                };
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConsultaDetallada_PorEmpleado) + "/" + nameof(P_ConsultaDetallada_PorEmpleado_Load));

                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
        }
        private void P_ConsultaDetallada_PorEmpleado_Shown(object sender, EventArgs e)
        {
            try
            {
                g_obj_Controladora.RecargarDatos_Empleados();
            }
            catch (Control_Errores)
            {
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                Salir_P_Base();
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log("", ex, nameof(P_ConsultaDetallada_PorEmpleado) + "/" + nameof(P_ConsultaDetallada_PorEmpleado_Shown));

                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                Salir_P_Base();
            }
        }
        #endregion

        #region Metodos del Datagridview
        private void ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex == 1)
                {
                    if (ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados[e.ColumnIndex,e.RowIndex].Value.ToString()=="0")
                    {
                        ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados[e.ColumnIndex, e.RowIndex].Value = 1;
                    }
                    else
                    {
                        ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados[e.ColumnIndex, e.RowIndex].Value = 0;
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConsultaDetallada_PorEmpleado) + "/" + nameof(ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados_CellContentClick));
            }
        }
        #endregion

        #region Botones Generar Fichaje, Seleccionar todo, deseleccionar todo, Filtros
        private void ex_btn_P_ConsultaDetallada_PorEmpleado_Generar_Click(object sender, EventArgs e)
        {
            Generar_Fichajes();
        }
        private void Generar_Fichajes()
        {
            if (Datos_Generales.Permisos_Comprobar(g_mdl_PRV_Opciones_Detalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, true))
            {
                g_obj_Controladora.RecargarDatos_ConsultaDetallada();
            }
        }

        private void ex_btn_P_ConsultaDetallada_PorEmpleado_SeleccionarTodo_Click(object sender, EventArgs e)
        {
            if (ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados.Rows.Count > 0)
            {
                ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados.Rows.Cast<DataGridViewRow>().ToList().ForEach(m => m.Cells[1].Value = 1);
            }
        }

        private void ex_btn_P_ConsultaDetallada_PorEmpleado_DeseleccionarTodos_Click(object sender, EventArgs e)
        {
            if (ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados.Rows.Count > 0)
            {
                ex_dgv_P_ConsultaDetallada_PorEmpleado_Empleados.Rows.Cast<DataGridViewRow>().ToList().ForEach(m => m.Cells[1].Value = 0);
            }
        }

        //Funciona para Habilitar el ScrollBar en el DataGridView del TabPage
        private void ex_tbc_P_ConsultaDetallada_PorEmpleado_Empleados_SelectedIndexChanged(object sender, EventArgs e)
        {
            Exferia_TabControl obj_Exferia_TabControl = (Exferia_TabControl)sender;

            //Comprueba si se ha seleccionado un TabPage
            if (obj_Exferia_TabControl.SelectedTab != null)
            {
                if (obj_Exferia_TabControl.SelectedTab.Controls != null && obj_Exferia_TabControl.SelectedTab.Controls.Count > 0)
                {
                    //Recorro  los controles hasta encontrar el DataGridView para añadirle el ScrollBar
                    foreach (Control obj_Control in obj_Exferia_TabControl.SelectedTab.Controls)
                    {
                        if (obj_Control.GetType() == typeof(Exferia_DataGridView))
                        {
                            ((Exferia_DataGridView)obj_Control).ScrollBars = ScrollBars.None;
                            ((Exferia_DataGridView)obj_Control).Refresh();
                            ((Exferia_DataGridView)obj_Control).ScrollBars = ScrollBars.Both;
                        }
                    }
                }
            }
        }

        private void ex_btn_P_ConsultadDetallada_PorEmpleado_Filtros_Click(object sender, EventArgs e)
        {
            if (ex_tbc_P_ConsultaDetallada_PorEmpleado_Empleados.Controls != null &&
               ex_tbc_P_ConsultaDetallada_PorEmpleado_Empleados.Controls.Count > 0)
            {
                MostrarOcultar_Columnas_Y_Filtros(ex_btn_P_ConsultadDetallada_PorEmpleado_Filtros.Location.X, 0);
            }
        }
        private void MostrarOcultar_Columnas_Y_Filtros(int _int_PosicionX, int _int_PosicionY)
        {
            try
            {
                PE_Listados_Filtros frm_PE_Listados_Filtros = new PE_Listados_Filtros(g_obj_Controladora.g_obj_ABS_Listado_ConsultaDetallada_PorEmpleado, g_obj_Controladora.g_obj_DataGridView_Selecionado.Columns, g_obj_Controladora.g_dct_ListadoFiltros_ConsultaDetallada_Empleado);

                frm_PE_Listados_Filtros.ShowDialog();

                if (frm_PE_Listados_Filtros.g_bol_BotonAceptar)
                {
                    //Mostrar/Ocultar las Columnas que no esten en el Listado
                    g_obj_Controladora.g_lst_ColumnasAMostrar_ConsultaDetallada_Empleado = frm_PE_Listados_Filtros.g_lst_ColumnasAMostrar;

                    //Rellenar los nuevos filtros
                    g_obj_Controladora.g_dct_ListadoFiltros_ConsultaDetallada_Empleado = frm_PE_Listados_Filtros.g_dct_ListadoFiltros.ToDictionary(entry => entry.Key, entry => entry.Value);

                    //Recargar el listado
                    g_obj_Controladora.RecargarDatos_ConsultaDetallada();
                }
            }
            catch (Exception)
            {

            }
        }

        #endregion

        #region Excel
        private void ex_btn_P_ConsultaDetallada_PorEmpleado_ExportarExcel_Click(object sender, EventArgs e)
        {
            Exportar_Excel();
        }
        private void Exportar_Excel()
        {
            if (Datos_Generales.Permisos_Comprobar(g_mdl_PRV_Opciones_Detalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.ExportarAExcel, true))
            {
                g_obj_Controladora.Generar_ListadoEnExcel();
            }
        }

        private void ex_btn_P_ConsultaDetallada_PorEmpleado_ExportarExcel_HojaUnica_Click(object sender, EventArgs e)
        {
            Exportar_Excel_HojaUnica();
        }
        private void Exportar_Excel_HojaUnica()
        {
            if (Datos_Generales.Permisos_Comprobar(g_mdl_PRV_Opciones_Detalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.ExportarAExcel, true))
            {
                g_obj_Controladora.Generar_ListadoEnExcel_HojaUnica();
            }
        }
        #endregion

        #region Empleados
        private void ex_chk_P_ConsultaDetallada_PorEmpleado_DadosDeBaja_CheckedChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null)
            {
                g_timer_Buscar_Empleados.Stop();
                g_timer_Buscar_Empleados.Start();
            }
        }

        private void ex_txt_P_ConsultaDetallada_PorEmpleado_Buscar_Exferia_TextBox_Evento_TextChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null)
            {
                g_timer_Buscar_Empleados.Stop();
                g_timer_Buscar_Empleados.Start();
            }
        }

        private void ex_chk_P_ConsultaDetallada_PorEmpleado_PalabraCompleta_CheckedChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null)
            {
                g_timer_Buscar_Empleados.Stop();
                g_timer_Buscar_Empleados.Start();
            }
        }

        private void ex_chk_P_ConsultaDetallada_PorEmpleado_MayusculasMinusculas_CheckedChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null)
            {
                g_timer_Buscar_Empleados.Stop();
                g_timer_Buscar_Empleados.Start();
            }
        }
        #endregion

        #region Teclas de acceso rapido
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            // Salir sin Seleccionar
            if (keyData == Keys.F10)
            {
                Salir_P_Base();
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        #endregion

        #region Cierre de Pantalla
        private void P_ConsultaDetallada_PorEmpleado_FormClosed(object sender, FormClosedEventArgs e)
        {
            //si hay un listado generado guardo el orden sino no
            if (g_obj_Controladora.g_obj_DataGridView_Selecionado != null && g_obj_Controladora.g_obj_DataGridView_Selecionado.Rows.Count > 0)
            {
                //Listado de Informe .....................................................................................................
                INTERNO_ConfiguracionPantalla_Modelo mdl_INTERNO_ConfiguracionPantalla_Modelo = new INTERNO_ConfiguracionPantalla_Modelo();
                Dictionary<string, int> dct_ColumnasOrden = new Dictionary<string, int>();
                Dictionary<string, int> dct_ColumnasAncho = new Dictionary<string, int>();
                foreach (DataGridViewColumn dgv_Columnas in g_obj_Controladora.g_obj_DataGridView_Selecionado.Columns)
                {
                    //Campos a Mostrar
                    if (dgv_Columnas.Visible)
                    {
                        //Columnas Orden
                        dct_ColumnasOrden.Add(dgv_Columnas.Name, dgv_Columnas.DisplayIndex);

                        //Columnas Ancho
                        dct_ColumnasAncho.Add(dgv_Columnas.Name, dgv_Columnas.Width);
                    }
                }
                mdl_INTERNO_ConfiguracionPantalla_Modelo.LISTADO_COLUMNASAMOSTRAR = g_obj_Controladora.g_lst_ColumnasAMostrar_ConsultaDetallada_Empleado;
                mdl_INTERNO_ConfiguracionPantalla_Modelo.LISTADO_COLUMNAS_ORDEN = dct_ColumnasOrden;
                mdl_INTERNO_ConfiguracionPantalla_Modelo.LISTADO_COLUMNAS_ANCHO = dct_ColumnasAncho;

                //Orden
                mdl_INTERNO_ConfiguracionPantalla_Modelo.LISTADO_ORDEN_COLUMNA_PORDEFECTO = "0";

                mdl_INTERNO_ConfiguracionPantalla_Modelo.LISTADO_ORDEN_DIRECCION_PORDEFECTO = "0";

                //Actualizar la Variables General
                if (Variables.G_DCT_CONFIGURACIONPANTALLA != null && Variables.G_DCT_CONFIGURACIONPANTALLA.Count > 0)
                {
                    //Ver si ya existia
                    if (Variables.G_DCT_CONFIGURACIONPANTALLA.ContainsKey(g_obj_Controladora.g_obj_ABS_Listado_ConsultaDetallada_PorEmpleado.NOMBRELISTADO_ALMACENARCONFIGURACION()))
                    {
                        Variables.G_DCT_CONFIGURACIONPANTALLA[g_obj_Controladora.g_obj_ABS_Listado_ConsultaDetallada_PorEmpleado.NOMBRELISTADO_ALMACENARCONFIGURACION()] = mdl_INTERNO_ConfiguracionPantalla_Modelo;
                    }
                    else
                    {
                        Variables.G_DCT_CONFIGURACIONPANTALLA.Add(g_obj_Controladora.g_obj_ABS_Listado_ConsultaDetallada_PorEmpleado.NOMBRELISTADO_ALMACENARCONFIGURACION(), mdl_INTERNO_ConfiguracionPantalla_Modelo);
                    }
                }
                else
                {
                    Variables.G_DCT_CONFIGURACIONPANTALLA = new Dictionary<string, INTERNO_ConfiguracionPantalla_Modelo>();
                    Variables.G_DCT_CONFIGURACIONPANTALLA.Add(g_obj_Controladora.g_obj_ABS_Listado_ConsultaDetallada_PorEmpleado.NOMBRELISTADO_ALMACENARCONFIGURACION(), mdl_INTERNO_ConfiguracionPantalla_Modelo);
                }

                //Actualizar el fichero XML
                Exferia_Aplicacion.General.Funciones_FicherosXML.ModificarXML_ConfiguracionPantallas(Variables.G_STR_CONFIGURACIONPANTALLA_TIPOPANTALLA_LISTADOS, g_obj_Controladora.g_obj_ABS_Listado_ConsultaDetallada_PorEmpleado.NOMBRELISTADO_ALMACENARCONFIGURACION(), mdl_INTERNO_ConfiguracionPantalla_Modelo);
                //###################################################################################################################################
                //..........................................................................................................................
            }
        }

        #endregion

        
    }
}
