CREATE TABLE calendario (
    fecha DATE NOT NULL PRIMARY KEY,            -- Fecha
    year INT NOT NULL,                          -- Año
    mes INT NOT NULL,                           -- Mes
    dia INT NOT NULL,                           -- Día
    diaSemana VARCHAR(20) NOT NULL,             -- Día de la semana (nombre)
    nDiaSemana INT NOT NULL,                    -- Número del día de la semana (1-7)
    trimestre INT NOT NULL,                     -- Trimestre (1-4)
    nSemana INT NOT NULL,                       -- Número de semana en el año
    esFinSemana BOOLEAN NOT NULL,               -- Si es fin de semana (TRUE/FALSE)
    esFeriado BOOLEAN DEFAULT FALSE,            -- Si es feriado (TRUE/FALSE)
    createdAt DATETIME DEFAULT CURRENT_TIMESTAMP, -- Fecha de creación (auto genera la hora actual)
    updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- Fecha de actualización
);

DELIMITER $$

CREATE PROCEDURE poblar_calendario()
BEGIN
    DECLARE v_fecha DATE;
    DECLARE v_fecha_fin DATE;
    DECLARE v_dia_semana INT;
    DECLARE v_trimestre INT;
    DECLARE v_n_semana INT;
    
    -- Definir el rango de fechas
    SET v_fecha = '2020-01-01';
    SET v_fecha_fin = '2030-12-31';
    
    -- Bucle para recorrer todas las fechas en el rango
    WHILE v_fecha <= v_fecha_fin DO
        -- Obtener el día de la semana como número (1=Domingo, 2=Lunes, ..., 7=Sábado)
        SET v_dia_semana = DAYOFWEEK(v_fecha);
        
        -- Calcular el trimestre (1, 2, 3, 4)
        SET v_trimestre = QUARTER(v_fecha);
        
        -- Calcular la semana del año (1 a 52)
        SET v_n_semana = WEEK(v_fecha, 1); -- El segundo parámetro '1' establece que la semana comienza el lunes
        
        -- Insertar la fecha calculada en la tabla calendario_nuevo
        INSERT INTO calendario (
            fecha, 
            year, 
            mes, 
            dia, 
            diaSemana, 
            nDiaSemana, 
            trimestre, 
            nSemana, 
            esFinSemana, 
            esFeriado,
            createdAt,
            updatedAt
        ) 
        VALUES (
            v_fecha,  -- Fecha
            YEAR(v_fecha),  -- Año
            MONTH(v_fecha),  -- Mes
            DAY(v_fecha),  -- Día
            DAYNAME(v_fecha),  -- Día de la semana (nombre, como 'Lunes', 'Martes', etc.)
            v_dia_semana,  -- Número del día de la semana (1=Domingo, ..., 7=Sábado)
            v_trimestre,  -- Trimestre (1, 2, 3, 4)
            v_n_semana,  -- Semana del año
            CASE 
                WHEN v_dia_semana IN (1, 7) THEN TRUE  -- Domingo (1) o Sábado (7)
                ELSE FALSE 
            END,  -- Es fin de semana (TRUE si es sábado o domingo)
            FALSE,  -- Es feriado (Inicialmente FALSE, puede actualizarse más tarde)
            CURRENT_TIMESTAMP,  -- createdAt
            CURRENT_TIMESTAMP   -- updatedAt
        );
        
        -- Avanzar un día
        SET v_fecha = DATE_ADD(v_fecha, INTERVAL 1 DAY);
    END WHILE;
    
END $$

DELIMITER ;

/* actualizar registros de dias feriados*/
UPDATE calendario c
JOIN feriados f ON c.fecha = f.fecha
SET c.esFeriado = 1;
