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_Controles;
using Exferia_Aplicacion.Visualizacion;

namespace Exferia_Formularios.ControlesPersonalizados
{
    public partial class UserControl_Mes : UserControl
    {
        private int g_int_Anyo = 2000;
        private Dictionary<int, Exferia_Button> g_dct_DiasButton_Personalizado = new Dictionary<int, Exferia_Button>();

        public string UserControl_Mes_Titulo
        {
            set
            {
                lbl_TituloMes.Text = value;
                Invalidate();
            }
            get
            {
                return lbl_TituloMes.Text;
            }
        }

        private int g_int_ClaveMes = 1;
        public int UserControl_Mes_Clave
        {
            set
            {
                g_int_ClaveMes = value;
            }
            get
            {
                return g_int_ClaveMes;
            }
        }

        public UserControl_Mes()
        {
            InitializeComponent();
        }

        public void Marcar_Fecha(int _int_Dia, int _int_Tipo)
        {
            if (_int_Tipo == 1)
            {
                g_dct_DiasButton_Personalizado[_int_Dia].FlatAppearance.BorderColor = Colores.G_COLOR_CALENDARIO_HOY_BORDE;
                g_dct_DiasButton_Personalizado[_int_Dia].FlatAppearance.BorderSize = 1;
                g_dct_DiasButton_Personalizado[_int_Dia].ForeColor = Color.Black;
            }
            else
            {
                g_dct_DiasButton_Personalizado[_int_Dia].BackColor = Colores.G_COLOR_CALENDARIO_SELECCIONADO_FONDO;
                g_dct_DiasButton_Personalizado[_int_Dia].ForeColor = Colores.G_COLOR_CALENDARIO_SELECCIONADO_LETRA;
            }
        }
        public void DesMarcar_Fecha(int _int_Dia, int _int_Tipo)
        {
            if (_int_Tipo == 1)
            {
                g_dct_DiasButton_Personalizado[_int_Dia].FlatAppearance.BorderSize = 0;
                g_dct_DiasButton_Personalizado[_int_Dia].ForeColor = Color.Black;
            }
            else
            {
                g_dct_DiasButton_Personalizado[_int_Dia].BackColor = BackColor;
                g_dct_DiasButton_Personalizado[_int_Dia].ForeColor = Color.Black;
            }
        }

        public void Actualizar_Dias_Anyo(int _int_Anyo)
        {
            g_int_Anyo = _int_Anyo;
            g_dct_DiasButton_Personalizado.Clear();

            //Numero de dias del Mes Anterior
            int int_NumeroDias_MesAnterior = 0;
            int int_Semana_Fin_MesAnterior = 0;
            if (g_int_ClaveMes == 1)//Si es Enero, se pone diciembre del año anterior
            {
                int_NumeroDias_MesAnterior = DateTime.DaysInMonth(_int_Anyo - 1, 12);
                DateTime dtt_FechaPrimerDia_MesAnterior = new DateTime(_int_Anyo - 1, 12, int_NumeroDias_MesAnterior);
                int_Semana_Fin_MesAnterior = (dtt_FechaPrimerDia_MesAnterior.Day - 1) / 7 + 1;
            }
            else
            {
                int_NumeroDias_MesAnterior = DateTime.DaysInMonth(_int_Anyo, g_int_ClaveMes - 1);
                DateTime dtt_FechaPrimerDia_MesAnterior = new DateTime(_int_Anyo, g_int_ClaveMes - 1, int_NumeroDias_MesAnterior);
                int_Semana_Fin_MesAnterior = (dtt_FechaPrimerDia_MesAnterior.Day - 1) / 7 + 1;
            }

            //Numero de dias del Mes Actual
            int int_NumeroDias_MesActual = DateTime.DaysInMonth(_int_Anyo, g_int_ClaveMes);
            DateTime dtt_FechaPrimerDia_MesActual = new DateTime(_int_Anyo, g_int_ClaveMes, 1);
            int int_Semana_Comienzo_MesActual = (dtt_FechaPrimerDia_MesActual.Day - 1) / 7 + 1;

            //Si el mes anterior termino en la 5 semana y el mes actual empieza en lunes se pone la seguna semana como inicial
            if (int_Semana_Fin_MesAnterior == 5 && dtt_FechaPrimerDia_MesActual.DayOfWeek.Equals(DayOfWeek.Monday))
            {
                int_Semana_Comienzo_MesActual += 1;
            }


            int int_DiaSemana = Exferia_Aplicacion.General.Funciones.Fecha_Delvolver_NumeroDiaSemana(dtt_FechaPrimerDia_MesActual);

            int int_ContadorDia = 1;
            for (int int_Contador_Filas = 1; int_Contador_Filas < 7; int_Contador_Filas++)
            {
                for (int int_Contador_Columas = 1; int_Contador_Columas < 8; int_Contador_Columas++)
                {
                    Exferia_Button btn_Dia = (Exferia_Button)Controls.Find("btn_F" + int_Contador_Filas + "C" + int_Contador_Columas, false).FirstOrDefault();
                    if (btn_Dia != null)
                    {
                        if (int_Contador_Filas >= int_Semana_Comienzo_MesActual && int_DiaSemana == int_Contador_Columas && int_ContadorDia <= int_NumeroDias_MesActual)
                        {
                            g_dct_DiasButton_Personalizado.Add(int_ContadorDia, btn_Dia);//Se utiliza para marcar los dias posteriormente

                            btn_Dia.BackColor = BackColor;
                            btn_Dia.ForeColor = Color.Black;
                            btn_Dia.FlatAppearance.BorderSize = 0;

                            btn_Dia.Text = int_ContadorDia.ToString();
                            int_ContadorDia += 1;
                            int_DiaSemana += 1;
                            btn_Dia.Visible = true;
                        }
                        else
                        {
                            btn_Dia.Visible = false;
                        }
                    }
                }

                int_DiaSemana = 1;
            }
        }

        public event EventHandler<EventArgs_UserControl_Mes> Button_Click;
        private void btn_Click(object sender, EventArgs e)
        {
            //Para que salte el evento en el otro lado
            Button_Click?.Invoke(sender, new EventArgs_UserControl_Mes(g_int_Anyo, g_int_ClaveMes, int.Parse(((Button)sender).Text)));
        }

        public event EventHandler<EventArgs_UserControl_Mes> Button_DobleClick;
        private void btn_DoubleClick(object sender, EventArgs e)
        {
            //Para que salte el evento en el otro lado
            Button_DobleClick?.Invoke(sender, new EventArgs_UserControl_Mes(g_int_Anyo, g_int_ClaveMes, int.Parse(((Button)sender).Text)));
        }
    }
}
