using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Exferia_Aplicacion.General;
using System.Globalization;
using Exferia_Controles;
using Exferia_Agenda._0_Modelos;
using Exferia_Agenda.General;
using Exferia_Aplicacion.Visualizacion;

namespace Exferia_Agenda._3_Vistas.ControlesPersonalizados_DentroPaneles
{
    public partial class CTU_P_Agenda_Horario : UserControl
    {
        #region Variables Privadas
        private Panel g_pnl_Principal = null;
        private P_Agenda g_frm_P_Agenda=null;

        //Scroll Horizontal
        private int g_int_ScrollHorizontal_Alto = 24;
        private int g_int_ScrollHorizontal_Separacion = 1;

        //Fila
        private int g_int_Fila_PosicionY = 0;
        private int g_int_Fila_Alto = 15;
        private int g_int_Fila_Separacion = 1;
        private List<DateTime> g_lst_Filas_Minutos = new List<DateTime>();

        //Posicion y Tamaños
        private int g_int_Etiqueta_DiaMesAnyo_Alto = 27;
        private int g_int_Fila_Hora_Separacion_Izquierda = 2;
        private int g_int_Fila_Hora_Ancho = 25;
        private int g_int_Fila_Minutos_Separacion_Izquierda = 2;
        private int g_int_Fila_Minutos_Ancho = 25;
        private int g_int_Fila_Separador_Separacion_Izquierda = 1;
        private int g_int_Fila_Separador_Ancho = 1;

        //Filtros
        private int g_int_IntervaloTiempo_Minutos = 15;
        private TimeSpan g_tms_Hora_Inicio = new TimeSpan(0, 0, 0);

        //Citas
        private string g_str_Tipo_Agenda = "1";//0-> Diario // 1-> Semanal //2-> Semanal laboral
        private List<INTERNO_AUX_Citas_Modelo> g_lst_INTERNO_AUX_Citas_Modelo = null;
        private int g_int_CitaPanel_Ancho_Minimo = 25;
        private int g_int_CitaPanel_Ancho_Maximo = 300;

        //Fechas
        public DateTime g_dtt_Fecha_Desde = DateTime.Now.Date;
        public DateTime g_dtt_Fecha_Hasta = DateTime.Now.Date;

        #endregion

        #region Constructor
        public CTU_P_Agenda_Horario()
        {
            InitializeComponent();

            g_lst_INTERNO_AUX_Citas_Modelo = new List<INTERNO_AUX_Citas_Modelo>();

            Repintar.Empezar(this);
        }
        #endregion

        #region Iniciar Agenda
        public void Iniciar(DateTime _dtt_Fecha_Desde, DateTime _dtt_Fecha_Hasta, string _str_Tipo_Agenda, int _int_IntervaloTiempo_Minutos, TimeSpan _tms_Hora_Inicio, P_Agenda _frm_P_Agenda)
        {
            g_dtt_Fecha_Desde = _dtt_Fecha_Desde;
            g_dtt_Fecha_Hasta = _dtt_Fecha_Hasta;
            g_str_Tipo_Agenda = _str_Tipo_Agenda;
            g_int_IntervaloTiempo_Minutos = _int_IntervaloTiempo_Minutos;
            g_tms_Hora_Inicio = _tms_Hora_Inicio;
            g_frm_P_Agenda = _frm_P_Agenda;
        }
        #endregion

        #region Cambiar Tipo de Agenda
        public void Cambiar_Tipo(   string _str_Tipo_Agenda, 
                                    DateTime _dtt_Fecha_Desde, 
                                    DateTime _dtt_Fecha_Hasta)
        {
            g_str_Tipo_Agenda = _str_Tipo_Agenda;
            g_dtt_Fecha_Desde = _dtt_Fecha_Desde;
            g_dtt_Fecha_Hasta = _dtt_Fecha_Hasta;
            Vaciar_Citas();

            Cargar_Horario();
        }
        #endregion

        #region Actualizar listado
        public void Actualizar_Listado(List<INTERNO_AUX_Citas_Modelo> _lst_INTERNO_AUX_Citas_Modelo)
        {
            Vaciar_Citas();

            g_lst_INTERNO_AUX_Citas_Modelo = _lst_INTERNO_AUX_Citas_Modelo;

            Citas_Agregar();
        }
        #endregion

        #region Cambiar Hora Inicio
        public void Cambiar_HoraInicio(TimeSpan _tms_Hora_Inicio)
        {
            try
            {
                g_tms_Hora_Inicio = _tms_Hora_Inicio;
                Ajuntar_Scroll();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Agenda_Horario) + "/" + nameof(Cambiar_HoraInicio));
            }
        }

        private void Ajuntar_Scroll()
        {
            try
            {
                DateTime dtt_Filtro_Desde = new DateTime(g_dtt_Fecha_Desde.Year, g_dtt_Fecha_Desde.Month, g_dtt_Fecha_Desde.Day, 0, 0, 0);
                DateTime dtt_Filtro_Hasta = dtt_Filtro_Desde.AddDays(1);

                List<DateTime> lst_fechasFiltradas = g_lst_Filas_Minutos.Where(m => m >= dtt_Filtro_Desde && m < dtt_Filtro_Hasta && m.Hour < g_tms_Hora_Inicio.Hours).ToList();

                if (lst_fechasFiltradas != null && lst_fechasFiltradas.Count > 0)
                {
                    int int_Cantidad_Filas_pordebajo = lst_fechasFiltradas.Count;

                    int int_Scroll_Calculado = ((g_int_Fila_Alto + g_int_Fila_Separacion) * int_Cantidad_Filas_pordebajo);
                    if (int_Scroll_Calculado > g_pnl_Principal.VerticalScroll.Maximum)
                    {
                        int_Scroll_Calculado = g_pnl_Principal.VerticalScroll.Maximum;
                    }

                    g_pnl_Principal.VerticalScroll.Value = int_Scroll_Calculado - 1;
                    g_pnl_Principal.VerticalScroll.Value = int_Scroll_Calculado;
                }

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

        }
        #endregion

        #region Cambiar Intervalo
        public void Cambiar_Intervalo(int _int_IntervaloTiempo_Minutos)
        {
            g_int_IntervaloTiempo_Minutos = _int_IntervaloTiempo_Minutos;

            Cargar_Horario();
        }
        #endregion

        #region Vaciar
        public void Vaciar_Todo()
        {
            try
            {
                //Vaciar Todo
                this.Controls.Clear();
                g_lst_Filas_Minutos.Clear();
                g_int_Fila_PosicionY = 0;

                if (g_pnl_Principal != null && g_pnl_Principal.VerticalScroll!=null)
                {
                    g_pnl_Principal.VerticalScroll.Value = 0;
                    g_pnl_Principal.VerticalScroll.Value = 1;
                }

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

        public void Vaciar_Citas()
        {
            try
            {
                //Vaciar Todo
                if (g_lst_INTERNO_AUX_Citas_Modelo!=null && g_lst_INTERNO_AUX_Citas_Modelo.Count>0)
                {
                    CTU_P_Agenda_ContenedorCita ctu_usc_Contenedor_Citas = null;
                    /*foreach (string str_Fecha in g_lst_INTERNO_AUX_Citas_Modelo.Select(M=>M.Fecha.ToString("yyyyMMdd")).Distinct())
                    {
                        ctu_usc_Contenedor_Citas=(CTU_P_Agenda_ContenedorCita)g_pnl_Principal.Controls.Find("ctu_usc_Contenedor_Citas_" + str_Fecha, true).FirstOrDefault();
                        if (ctu_usc_Contenedor_Citas!=null)
                        {
                            //Buscar
                            Panel pnl_Principal = (Panel)ctu_usc_Contenedor_Citas.Controls[0];
                            List<Control> lst_ABorrar = new List<Control>();
                            foreach (Control obj_Control in pnl_Principal.Controls)
                            {
                                if (obj_Control.Name.Contains(nameof(CTU_P_Agenda_Cita)))
                                {
                                    lst_ABorrar.Add(obj_Control);
                                }
                            }

                            //Borrar
                            if (lst_ABorrar!=null && lst_ABorrar.Count>0)
                            {
                                foreach (Control obj_Control in lst_ABorrar)
                                {
                                    pnl_Principal.Controls.Remove(obj_Control);
                                }
                            }

                            pnl_Principal.Refresh();
                        }
                    }*/
                }

                g_lst_INTERNO_AUX_Citas_Modelo = null;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Agenda_Horario) + "/" + nameof(Vaciar_Citas));
            }
        }
        #endregion

        #region Cargar Horario
        public void Cargar_Horario()
        {
            try
            {
                this.Visible = false;

                //Vaciar Todo
                Vaciar_Todo();

                //Cargar paneles contendores
                Cargar_Horario_PanelesDia();

                //Horas
                int int_CantidadLineaHoras_Contador = 0;
                string str_HorasFinales = string.Format("{0:00}", 0);

                //Minutos
                int int_CantidadLineaMinutos = (60 / g_int_IntervaloTiempo_Minutos) - 1;
                int int_CantidadLineaMinutos_Contador = 0;

                DateTime dtt_FechaMinutos_Contador = new DateTime(g_dtt_Fecha_Desde.Year, g_dtt_Fecha_Desde.Month, g_dtt_Fecha_Desde.Day, 0, 0, 0);
                DateTime dtt_FechaMinutos_Hasta = new DateTime(g_dtt_Fecha_Desde.Year, g_dtt_Fecha_Desde.Month, g_dtt_Fecha_Desde.Day, 0, 0, 0);
                dtt_FechaMinutos_Hasta = dtt_FechaMinutos_Hasta.AddDays(1);

                while (dtt_FechaMinutos_Hasta >= dtt_FechaMinutos_Contador)
                {
                    //Añadir
                    Cargar_Horario_Linea(dtt_FechaMinutos_Contador, str_HorasFinales, false);

                    //Contador de minutos
                    if (int_CantidadLineaMinutos_Contador == int_CantidadLineaMinutos)
                    {
                        int_CantidadLineaMinutos_Contador = 0;
                    }
                    else
                    {
                        int_CantidadLineaMinutos_Contador += 1;
                        str_HorasFinales = "";
                    }

                    //Contador de Horas
                    if (int_CantidadLineaMinutos_Contador == 0)
                    {
                        int_CantidadLineaHoras_Contador += 1;
                        str_HorasFinales = string.Format("{0:00}", int_CantidadLineaHoras_Contador);
                    }

                    dtt_FechaMinutos_Contador = dtt_FechaMinutos_Contador.AddMinutes(g_int_IntervaloTiempo_Minutos);
                }

                if (dtt_FechaMinutos_Contador.Minute > 0)
                {
                    Cargar_Horario_Linea(dtt_FechaMinutos_Contador, "", true);
                }
                else
                {
                    Cargar_Horario_Linea(dtt_FechaMinutos_Contador, string.Format("{0:00}", dtt_FechaMinutos_Contador.Hour), true);
                }

                //ordenar
                g_lst_Filas_Minutos = g_lst_Filas_Minutos.OrderBy(m => m).ToList();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Agenda_Horario) + "/" + nameof(Cargar_Horario));
            }
            finally
            {
                this.Visible = true;

                //Agregar todas las citas
                Citas_Agregar();
               
                //Ajuntar el Scroll
                Ajuntar_Scroll();
            }
        }
        private void Cargar_Horario_PanelesDia()
        {
            try
            {
                //Panel Principal
                g_pnl_Principal = new Panel();
                g_pnl_Principal.Location = new Point(0, g_int_Etiqueta_DiaMesAnyo_Alto);
                g_pnl_Principal.Size = new Size(this.Width, (this.Height - g_int_Etiqueta_DiaMesAnyo_Alto) - (g_int_ScrollHorizontal_Alto + g_int_ScrollHorizontal_Separacion));
                g_pnl_Principal.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
                g_pnl_Principal.AutoScroll = true;
                this.Controls.Add(g_pnl_Principal);

                int int_Posicion_X = g_int_Fila_Hora_Separacion_Izquierda +
                                            g_int_Fila_Hora_Ancho +
                                            g_int_Fila_Minutos_Separacion_Izquierda +
                                            g_int_Fila_Minutos_Ancho +
                                            g_int_Fila_Separador_Separacion_Izquierda +
                                            g_int_Fila_Separador_Ancho;

                //Semana (De Lunes a Domingo) o Semana laboral (De Lunes a Viernes)
                if (g_str_Tipo_Agenda == Variables_Agenda.G_MDL_AGENDA_TIPO_SEMANA.Codigo ||
                    g_str_Tipo_Agenda == Variables_Agenda.G_MDL_AGENDA_TIPO_SEMANALABORAL.Codigo)
                {
                    DateTime dtt_FechaContador = g_dtt_Fecha_Desde;
                    int int_CantidadDias = (g_dtt_Fecha_Hasta.Date - g_dtt_Fecha_Desde.Date).Days+1;
                    int int_AnchoPanels = (((g_pnl_Principal.Width - int_Posicion_X) / int_CantidadDias)) - int_CantidadDias;

                    while (g_dtt_Fecha_Hasta >= dtt_FechaContador)
                    {
                        //Agregar Titulo de Día de la Semana
                        Exferia_Label_SinColor ex_lbl_DiaSemana = new Exferia_Label_SinColor();
                        ex_lbl_DiaSemana.Location = new Point(int_Posicion_X, 0);
                        ex_lbl_DiaSemana.AutoSize = false;
                        ex_lbl_DiaSemana.Size = new Size(int_AnchoPanels, g_int_Etiqueta_DiaMesAnyo_Alto);
                        ex_lbl_DiaSemana.Font = new Font("Arial", 8F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0)));
                        ex_lbl_DiaSemana.Text = dtt_FechaContador.ToString("dddd").ToUpper() + System.Environment.NewLine +
                                                dtt_FechaContador.ToString("dd MMMM, yyyy");
                        this.Controls.Add(ex_lbl_DiaSemana);

                        CTU_P_Agenda_ContenedorCita ctu_usc_Contenedor_Citas = new CTU_P_Agenda_ContenedorCita();
                        ctu_usc_Contenedor_Citas.Name = "ctu_usc_Contenedor_Citas_" + dtt_FechaContador.ToString("yyyyMMdd");
                        ctu_usc_Contenedor_Citas.Size = new Size(int_AnchoPanels, g_pnl_Principal.Height);
                        ctu_usc_Contenedor_Citas.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
                        ctu_usc_Contenedor_Citas.Location = new Point(int_Posicion_X, 0);
                        ctu_usc_Contenedor_Citas.Tag = dtt_FechaContador.ToString("yyyyMMdd");
                        ctu_usc_Contenedor_Citas.CTU_P_Agenda_ContenedorCita_Mostrar += new System.EventHandler<INTERNO_EventArgs_Boolean>(Scroll_Mostrar);
                        //Agrego el panel
                        g_pnl_Principal.Controls.Add(ctu_usc_Contenedor_Citas);
                        ctu_usc_Contenedor_Citas.BringToFront();

                        //Agregar ScrollView horizontal
                        HScrollBar hsc_Scroll_Horizontal = new HScrollBar();
                        hsc_Scroll_Horizontal.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
                        hsc_Scroll_Horizontal.Location = new System.Drawing.Point(int_Posicion_X, g_int_Etiqueta_DiaMesAnyo_Alto + g_pnl_Principal.Height + g_int_ScrollHorizontal_Separacion);
                        hsc_Scroll_Horizontal.Name = "hsc_Scroll_Horizontal_" + dtt_FechaContador.ToString("yyyyMMdd"); ;
                        hsc_Scroll_Horizontal.Size = new System.Drawing.Size(int_AnchoPanels, g_int_ScrollHorizontal_Alto);
                        hsc_Scroll_Horizontal.TabIndex = 0;
                        hsc_Scroll_Horizontal.Visible = false;
                        hsc_Scroll_Horizontal.Tag = dtt_FechaContador.ToString("yyyyMMdd");
                        hsc_Scroll_Horizontal.Scroll += new System.Windows.Forms.ScrollEventHandler(this.hsc_Scroll_Horizontal_Scroll);
                        this.Controls.Add(hsc_Scroll_Horizontal);

                        //Añadir un dia a la fecha
                        dtt_FechaContador = dtt_FechaContador.AddDays(1);

                        //Añadir al ancho para poner el siguiente panel
                        int_Posicion_X += (int_AnchoPanels + 1);
                    }
                }
                //Diario
                else
                {
                    int int_AnchoPanel = (g_pnl_Principal.Width - int_Posicion_X - 20);

                    //Agregar Titulo de Día de la Semana
                    Exferia_Label_SinColor ex_lbl_DiaSemana = new Exferia_Label_SinColor();
                    ex_lbl_DiaSemana.Location = new Point(int_Posicion_X, 0);
                    ex_lbl_DiaSemana.AutoSize = false;
                    ex_lbl_DiaSemana.Size = new Size(int_AnchoPanel - 20, g_int_Etiqueta_DiaMesAnyo_Alto);
                    ex_lbl_DiaSemana.Font = new Font("Arial", 8F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0)));
                    ex_lbl_DiaSemana.Text = g_dtt_Fecha_Desde.ToString("dddd").ToUpper() + System.Environment.NewLine +
                                            g_dtt_Fecha_Desde.ToString("dd MMMM, yyyy");
                    this.Controls.Add(ex_lbl_DiaSemana);

                    CTU_P_Agenda_ContenedorCita ctu_usc_Contenedor_Citas = new CTU_P_Agenda_ContenedorCita();
                    ctu_usc_Contenedor_Citas.Name = "ctu_usc_Contenedor_Citas_" + g_dtt_Fecha_Desde.ToString("yyyyMMdd");
                    ctu_usc_Contenedor_Citas.Size = new Size(int_AnchoPanel, g_pnl_Principal.Height);
                    ctu_usc_Contenedor_Citas.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
                    ctu_usc_Contenedor_Citas.Location = new Point(int_Posicion_X, 0);
                    ctu_usc_Contenedor_Citas.Tag = g_dtt_Fecha_Desde.ToString("yyyyMMdd");
                    ctu_usc_Contenedor_Citas.CTU_P_Agenda_ContenedorCita_Mostrar += new System.EventHandler<INTERNO_EventArgs_Boolean>(Scroll_Mostrar);
                    //Agrego el panel
                    g_pnl_Principal.Controls.Add(ctu_usc_Contenedor_Citas);
                    ctu_usc_Contenedor_Citas.BringToFront();

                    //Agregar ScrollView horizontal
                    HScrollBar hsc_Scroll_Horizontal = new HScrollBar();
                    hsc_Scroll_Horizontal.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
                    hsc_Scroll_Horizontal.Location = new System.Drawing.Point(int_Posicion_X, g_int_Etiqueta_DiaMesAnyo_Alto + g_pnl_Principal.Height + g_int_ScrollHorizontal_Separacion);
                    hsc_Scroll_Horizontal.Name = "hsc_Scroll_Horizontal_" + g_dtt_Fecha_Desde.ToString("yyyyMMdd"); ;
                    hsc_Scroll_Horizontal.Size = new System.Drawing.Size(int_AnchoPanel, g_int_ScrollHorizontal_Alto);
                    hsc_Scroll_Horizontal.TabIndex = 0;
                    hsc_Scroll_Horizontal.Visible = false;
                    hsc_Scroll_Horizontal.Tag = g_dtt_Fecha_Desde.ToString("yyyyMMdd");
                    hsc_Scroll_Horizontal.Scroll += new System.Windows.Forms.ScrollEventHandler(this.hsc_Scroll_Horizontal_Scroll);
                    this.Controls.Add(hsc_Scroll_Horizontal);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Agenda_Horario) + "/" + nameof(Cargar_Horario_PanelesDia));
            }
        }

        #region Scroll
        private void Scroll_Mostrar(object sender, INTERNO_EventArgs_Boolean e)
        {
            try
            {
                HScrollBar hsc_Scroll_Horizontal = (HScrollBar)this.Controls.Find("hsc_Scroll_Horizontal_" + (((CTU_P_Agenda_ContenedorCita)sender).Tag.ToString()), false).FirstOrDefault();
                if (hsc_Scroll_Horizontal != null)
                {
                    hsc_Scroll_Horizontal.Visible = e.Valor;
                }

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


        private void hsc_Scroll_Horizontal_Scroll(object sender, ScrollEventArgs e)
        {
            try
            {
                CTU_P_Agenda_ContenedorCita ctu_usc_Contenedor_Citas = (CTU_P_Agenda_ContenedorCita)g_pnl_Principal.Controls.Find("ctu_usc_Contenedor_Citas_" + (((HScrollBar)sender).Tag.ToString()), false).FirstOrDefault();
                if (ctu_usc_Contenedor_Citas != null)
                {
                    ctu_usc_Contenedor_Citas.Mover_Panel_Scroll(e.NewValue);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Agenda_Horario) + "/" + nameof(hsc_Scroll_Horizontal_Scroll));
            }
        }
        #endregion

        private void Cargar_Horario_Linea(DateTime _dtt_Fecha, string _str_Hora_A_Mostrar, bool _bol_UltimaFila)
        {
            try
            {
                //Poner la hora
                if (_str_Hora_A_Mostrar.Trim().Length > 0)
                {
                    Exferia_Label_SinColor ex_lbl_Hora = new Exferia_Label_SinColor();
                    ex_lbl_Hora.AutoSize = false;
                    ex_lbl_Hora.Font = new Font("Arial", 10F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(0)));
                    ex_lbl_Hora.BackColor = ColorTranslator.FromHtml("#d7e8fb");
                    ex_lbl_Hora.Size = new Size(g_int_Fila_Hora_Ancho, g_int_Fila_Alto);
                    ex_lbl_Hora.Location = new Point(g_int_Fila_Hora_Separacion_Izquierda, g_int_Fila_PosicionY);
                    ex_lbl_Hora.Text = _str_Hora_A_Mostrar;
                    g_pnl_Principal.Controls.Add(ex_lbl_Hora);
                }
                else
                {
                    CTU_P_Agenda_Vacio ctu_usr_Vacio_Horas = new CTU_P_Agenda_Vacio();
                    ctu_usr_Vacio_Horas.AutoSize = false;
                    ctu_usr_Vacio_Horas.BackColor = ColorTranslator.FromHtml("#d7e8fb");
                    ctu_usr_Vacio_Horas.Size = new Size(g_int_Fila_Hora_Ancho, g_int_Fila_Alto);
                    ctu_usr_Vacio_Horas.Location = new Point(g_int_Fila_Hora_Separacion_Izquierda, g_int_Fila_PosicionY);
                    g_pnl_Principal.Controls.Add(ctu_usr_Vacio_Horas);
                }

                //Poner la Minuto
                Exferia_Label_SinColor ex_lbl_Minuto = new Exferia_Label_SinColor();
                ex_lbl_Minuto.Name = "ex_lbl_Minuto_" + string.Format("{0:00}", _dtt_Fecha.Hour) + "_" + string.Format("{0:00}", _dtt_Fecha.Minute);
                ex_lbl_Minuto.AutoSize = false;
                ex_lbl_Minuto.BackColor = ColorTranslator.FromHtml("#d7e8fb");
                ex_lbl_Minuto.Size = new Size(g_int_Fila_Minutos_Ancho, g_int_Fila_Alto);
                ex_lbl_Minuto.Location = new Point((g_int_Fila_Hora_Ancho + g_int_Fila_Hora_Separacion_Izquierda + g_int_Fila_Minutos_Separacion_Izquierda), g_int_Fila_PosicionY);
                ex_lbl_Minuto.Text = string.Format("{0:00}", _dtt_Fecha.Minute);
                ex_lbl_Minuto.Tag = string.Format("{0:00}", _dtt_Fecha.Hour) + "_" + string.Format("{0:00}", _dtt_Fecha.Minute);
                g_pnl_Principal.Controls.Add(ex_lbl_Minuto);

                //Poner la Separacion
                Exferia_Label_SinColor ex_lbl_Separacion = new Exferia_Label_SinColor();
                ex_lbl_Separacion.AutoSize = false;
                ex_lbl_Separacion.BackColor = ColorTranslator.FromHtml("#585858");
                ex_lbl_Separacion.Size = new Size(g_int_Fila_Separador_Ancho, g_int_Fila_Alto);
                ex_lbl_Separacion.Location = new Point((g_int_Fila_Hora_Ancho + g_int_Fila_Hora_Separacion_Izquierda + g_int_Fila_Minutos_Separacion_Izquierda + g_int_Fila_Hora_Ancho + g_int_Fila_Separador_Separacion_Izquierda), g_int_Fila_PosicionY);
                g_pnl_Principal.Controls.Add(ex_lbl_Separacion);

                //.....................................................................................................
                int int_CantidadDias = 1;
                if (g_dtt_Fecha_Hasta.Date != g_dtt_Fecha_Desde.Date)
                {
                    int_CantidadDias = (g_dtt_Fecha_Hasta.Date - g_dtt_Fecha_Desde.Date).Days+1;
                }

                int int_RestarDias = 0;
                if (_bol_UltimaFila && _dtt_Fecha.Hour == 0 && _dtt_Fecha.Minute == 0)
                {
                    int_RestarDias = -1;
                }
                for (int int_Contador = 0; int_Contador < int_CantidadDias; int_Contador++)
                {
                    //Agregar al listado de fechasMinutos
                    g_lst_Filas_Minutos.Add(_dtt_Fecha);

                    //Buscar el panel
                    CTU_P_Agenda_ContenedorCita ctu_usc_Contenedor_Citas_Fecha = (CTU_P_Agenda_ContenedorCita)g_pnl_Principal.Controls.Find("ctu_usc_Contenedor_Citas_" + _dtt_Fecha.AddDays(int_RestarDias).ToString("yyyyMMdd"), false).FirstOrDefault();
                    if (ctu_usc_Contenedor_Citas_Fecha != null)
                    {
                        //Poner label hasta el Final
                        CTU_P_Agenda_Vacio ctu_usr_Vacio = new CTU_P_Agenda_Vacio();
                        ctu_usr_Vacio.AutoSize = false;
                        ctu_usr_Vacio.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
                        ctu_usr_Vacio.BackColor = ColorTranslator.FromHtml("#FFFFFF");
                        ctu_usr_Vacio.Size = new Size(ctu_usc_Contenedor_Citas_Fecha.Width, g_int_Fila_Alto);
                        ctu_usr_Vacio.Location = new Point(0, g_int_Fila_PosicionY);
                        ctu_usc_Contenedor_Citas_Fecha.AgregarControles(ctu_usr_Vacio, false);
                    }

                    //Sumar un dia a la fecha a recorrer
                    _dtt_Fecha = _dtt_Fecha.AddDays(1);
                }

                //Sumar para posicion Y
                g_int_Fila_PosicionY += (g_int_Fila_Alto + g_int_Fila_Separacion);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Agenda_Horario) + "/" + nameof(Cargar_Horario));
            }
        }

        #endregion

        #region Agregar Citas
        private void Citas_Agregar()
        {
            try
            {
                if (g_lst_INTERNO_AUX_Citas_Modelo != null && g_lst_INTERNO_AUX_Citas_Modelo.Count > 0)
                {
                    if (g_pnl_Principal != null && g_pnl_Principal.VerticalScroll != null)
                    {
                        g_pnl_Principal.VerticalScroll.Value = 0;
                        g_pnl_Principal.VerticalScroll.Value = 1;
                    }

                    //Listado de Fechas
                    List<DateTime> lst_ListadoFechas = g_lst_INTERNO_AUX_Citas_Modelo.Select(m => m.fechaHoraInicio.Date).Distinct().ToList();
                    int int_Citas_Posicion_X = 2;
                    foreach (DateTime dtt_Fecha in lst_ListadoFechas)
                    {
                        DateTime dtt_Fecha_Busqueda_Hasta = dtt_Fecha.AddDays(1);

                        //Buscar las Citas para fecha actual
                        List<INTERNO_AUX_Citas_Modelo> lst_Citas_Filtradas = g_lst_INTERNO_AUX_Citas_Modelo.Where(m => m.fechaHoraInicio >= dtt_Fecha && m.fechaHoraInicio < dtt_Fecha_Busqueda_Hasta).ToList();
                        int_Citas_Posicion_X = 2;
                        if (lst_Citas_Filtradas != null && lst_Citas_Filtradas.Count > 0)
                        {
                            //Buscar el panel
                            CTU_P_Agenda_ContenedorCita ctu_usc_Contenedor_Citas_Fecha = (CTU_P_Agenda_ContenedorCita)g_pnl_Principal.Controls.Find("ctu_usc_Contenedor_Citas_" + dtt_Fecha.ToString("yyyyMMdd"), false).FirstOrDefault();
                            if (ctu_usc_Contenedor_Citas_Fecha != null)
                            {
                                /*
                                //Asesores
                                List<long> lst_idAsesores = lst_Citas_Filtradas.Where(m => m.Asesor_Id != null).OrderBy(m => m.Asesor_Descripcion).Select(m => m.Asesor_Id.Value).Distinct().ToList();
                                if (lst_Citas_Filtradas.Exists(m => m.Asesor_Id == null))
                                {
                                    if (lst_idAsesores == null)
                                    {
                                        lst_idAsesores = new List<long>();
                                    }
                                    lst_idAsesores.Add(-1);
                                }
                                int int_Asesores = lst_idAsesores.Count;

                                //Ancho panel Citas
                                int int_Ancho_Cita = ((ctu_usc_Contenedor_Citas_Fecha.Width - int_Asesores) - 2) / int_Asesores;
                                if (int_Ancho_Cita < g_int_CitaPanel_Ancho_Minimo)
                                {
                                    int_Ancho_Cita = g_int_CitaPanel_Ancho_Minimo;
                                }
                                else if (int_Ancho_Cita > g_int_CitaPanel_Ancho_Maximo)
                                {
                                    int_Ancho_Cita = g_int_CitaPanel_Ancho_Maximo;
                                }

                                //Con Asesores
                                foreach (long lng_idAsesor in lst_idAsesores.Where(m => m > -1))
                                {
                                    foreach (INTERNO_AUX_Citas_Modelo mdl_INTERNO_AUX_Citas_Modelo in lst_Citas_Filtradas.Where(m => m.Asesor_Id != null && m.Asesor_Id.Value == lng_idAsesor))
                                    {
                                        //Buscar el label del horario desde
                                        int? int_Posicion_Y_Desde = Buscar_Posicion(mdl_INTERNO_AUX_Citas_Modelo.fechaHoraInicio);
                                        if (int_Posicion_Y_Desde != null)
                                        {
                                            //Buscar el label del horario hasta
                                            int? int_Posicion_Y_Hasta = Buscar_Posicion(mdl_INTERNO_AUX_Citas_Modelo.fechaHoraFin);
                                            if (int_Posicion_Y_Hasta != null)
                                            {
                                                if (int_Posicion_Y_Desde != int_Posicion_Y_Hasta)
                                                {
                                                    CTU_P_Agenda_Cita ctu_Cita = new CTU_P_Agenda_Cita(mdl_INTERNO_AUX_Citas_Modelo, g_frm_P_Agenda);
                                                    ctu_Cita.Name = "CTU_P_Agenda_Cita_" + mdl_INTERNO_AUX_Citas_Modelo.id;
                                                    ctu_Cita.Size = new Size(int_Ancho_Cita, int_Posicion_Y_Hasta.Value - int_Posicion_Y_Desde.Value);
                                                    ctu_Cita.Location = new Point(int_Citas_Posicion_X, int_Posicion_Y_Desde.Value);
                                                    ctu_Cita.BorderStyle = BorderStyle.FixedSingle;
                                                    //Agrego el panel
                                                    ctu_usc_Contenedor_Citas_Fecha.AgregarControles(ctu_Cita, true);

                                                    ctu_Cita.BringToFront();
                                                }
                                            }
                                        }
                                    }

                                    //Sumar el ancho y una separacion
                                    int_Citas_Posicion_X += (int_Ancho_Cita + 1);
                                }

                                //Sin Asesores
                                if (lst_idAsesores.Exists(m => m == -1))
                                {
                                    foreach (INTERNO_AUX_Citas_Modelo mdl_INTERNO_AUX_Citas_Modelo in lst_Citas_Filtradas.Where(m => m.Asesor_Id == null))
                                    {
                                        //Buscar el label del horario desde
                                        int? int_Posicion_Y_Desde = Buscar_Posicion(mdl_INTERNO_AUX_Citas_Modelo.fechaHoraInicio);
                                        if (int_Posicion_Y_Desde != null)
                                        {
                                            //Buscar el label del horario hasta
                                            int? int_Posicion_Y_Hasta = Buscar_Posicion(mdl_INTERNO_AUX_Citas_Modelo.fechaHoraFin);
                                            if (int_Posicion_Y_Hasta != null)
                                            {
                                                if (int_Posicion_Y_Desde != int_Posicion_Y_Hasta)
                                                {
                                                    CTU_P_Agenda_Cita ctu_Cita = new CTU_P_Agenda_Cita(mdl_INTERNO_AUX_Citas_Modelo, g_frm_P_Agenda);
                                                    ctu_Cita.Size = new Size(int_Ancho_Cita, int_Posicion_Y_Hasta.Value - int_Posicion_Y_Desde.Value);
                                                    ctu_Cita.Location = new Point(int_Citas_Posicion_X, int_Posicion_Y_Desde.Value);
                                                    ctu_Cita.BorderStyle = BorderStyle.FixedSingle;

                                                    //Agrego el panel
                                                    ctu_usc_Contenedor_Citas_Fecha.AgregarControles(ctu_Cita, true);

                                                    ctu_Cita.BringToFront();
                                                }
                                            }
                                        }
                                    }
                                }*/
                            }
                        }
                    }

                    //Ajuntar el Scroll
                    Ajuntar_Scroll();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Agenda_Horario) + "/" + nameof(Citas_Agregar));
            }
        }
        private int? Buscar_Posicion(DateTime _dtt_Fecha)
        {
            int? int_Posicion_Y = null;
            try
            {
                DateTime? dtt_Filtrado = null;
                bool bol_UltimoRegistro = false;
                //Ver si la fecha es mayor o igual que alguna de las filas de minutos creados
                if (g_lst_Filas_Minutos.Exists(m => _dtt_Fecha >= m))
                {
                    //Ver si la fecha es menor que alguna de las filas de minutos creados
                    if (g_lst_Filas_Minutos.Exists(m => _dtt_Fecha < m))
                    {
                        for (int int_Contador = 0; int_Contador < g_lst_Filas_Minutos.Count - 1; int_Contador++)
                        {
                            if (g_lst_Filas_Minutos[int_Contador] <= _dtt_Fecha &&
                                g_lst_Filas_Minutos[int_Contador + 1] > _dtt_Fecha)
                            {
                                dtt_Filtrado = g_lst_Filas_Minutos[int_Contador];
                                break;
                            }
                        }
                    }
                    //Ultima Fila
                    else
                    {
                        dtt_Filtrado = g_lst_Filas_Minutos.Last();
                        bol_UltimoRegistro = true;
                    }
                }
                //Ver si la fecha es menor que alguna de las filas de minutos creados
                else if (g_lst_Filas_Minutos.Exists(m => _dtt_Fecha < m))
                {
                    dtt_Filtrado = g_lst_Filas_Minutos.First();
                }

                if (dtt_Filtrado != null)
                {
                    Exferia_Label_SinColor ex_lbl_Final = (Exferia_Label_SinColor)g_pnl_Principal.Controls.Find("ex_lbl_Minuto_" + string.Format("{0:00}", dtt_Filtrado.Value.Hour) + "_" + string.Format("{0:00}", dtt_Filtrado.Value.Minute), false).FirstOrDefault();
                    if (ex_lbl_Final != null)
                    {
                        int_Posicion_Y = ex_lbl_Final.Location.Y;

                        TimeSpan tms_Label = TimeSpan.ParseExact(ex_lbl_Final.Tag.ToString().Replace("_", ":"), "hh\\:mm", CultureInfo.InvariantCulture);
                        if (tms_Label.Minutes != _dtt_Fecha.Minute)
                        {
                            int int_Minutos_Diferencia = _dtt_Fecha.Minute - tms_Label.Minutes;

                            if (int_Minutos_Diferencia > 0)
                            {
                                int_Posicion_Y += (int_Minutos_Diferencia * g_int_IntervaloTiempo_Minutos) / g_int_Fila_Alto;
                            }
                        }

                        //Si no es ultimo registro
                        if (bol_UltimoRegistro)
                        {
                            if (int_Posicion_Y > ex_lbl_Final.Location.Y + ex_lbl_Final.Height)
                            {
                                int_Posicion_Y = ex_lbl_Final.Location.Y + ex_lbl_Final.Height;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Agenda_Horario) + "/" + nameof(Buscar_Posicion));
            }

            return int_Posicion_Y;
        }
        #endregion




    }
}

