-- Script de carga directa para horarios administrativos
-- Genera HorariosAsignados (id_quincena 25-28), DetalleHorariosSemana y DiasDescanso
-- Compatible con MariaDB (sin CTE)

-- 0) Preparar datos base
CREATE TEMPORARY TABLE tmp_curps AS
SELECT DISTINCT curp FROM miembros_area_admin
UNION
SELECT DISTINCT CURP COLLATE latin1_general_ci AS curp FROM horarios_admin;

CREATE TEMPORARY TABLE tmp_quincenas AS
SELECT id_quincena, fecha_inicio, fecha_fin
FROM Quincenas
WHERE id_quincena IN (25, 26, 27, 28);

CREATE TEMPORARY TABLE tmp_nums (n INT PRIMARY KEY);
INSERT INTO tmp_nums (n) VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),
(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),
(31);

CREATE TEMPORARY TABLE tmp_fechas AS
SELECT q.id_quincena,
       DATE_ADD(q.fecha_inicio, INTERVAL n.n DAY) AS fecha
FROM tmp_quincenas q
JOIN tmp_nums n
  ON DATE_ADD(q.fecha_inicio, INTERVAL n.n DAY) <= q.fecha_fin;

DROP TEMPORARY TABLE IF EXISTS tmp_fechas_semana;
CREATE TEMPORARY TABLE tmp_fechas_semana AS
SELECT f.id_quincena,
       f.fecha,
       1 + (
           SELECT COUNT(*)
           FROM tmp_fechas f2
           WHERE f2.id_quincena = f.id_quincena
             AND f2.fecha < f.fecha
             AND DAYOFWEEK(f2.fecha) = 1
       ) AS semana,
         CONVERT(
           CASE DAYOFWEEK(f.fecha)
             WHEN 1 THEN 'Domingo'
             WHEN 2 THEN 'Lunes'
             WHEN 3 THEN 'Martes'
             WHEN 4 THEN 'Miércoles'
             WHEN 5 THEN 'Jueves'
             WHEN 6 THEN 'Viernes'
             WHEN 7 THEN 'Sábado'
           END USING latin1
         ) COLLATE latin1_general_ci AS dia_semana
FROM tmp_fechas f;

-- 1) Insertar HorariosAsignados por CURP y quincena
INSERT INTO HorariosAsignados (curp, id_quincena, fecha_inicio, fecha_fin)
SELECT c.curp, q.id_quincena, q.fecha_inicio, q.fecha_fin
FROM tmp_curps c
CROSS JOIN tmp_quincenas q
WHERE NOT EXISTS (
    SELECT 1 FROM HorariosAsignados h
    WHERE h.curp = c.curp AND h.id_quincena = q.id_quincena
);

-- 2) Insertar DetalleHorariosSemana (7 días por semana) con fechas reales de la quincena
INSERT INTO DetalleHorariosSemana (id_horario, semana, dia_semana, fecha, hora_entrada, hora_salida)
SELECT h.id_horario,
       f.semana,
       f.dia_semana,
       f.fecha,
       COALESCE(ha.hora_entrada, '00:00:00') AS hora_entrada,
       COALESCE(
           CASE WHEN f.dia_semana = 'Domingo' THEN '00:00:00' ELSE ha.hora_salida END,
           '00:00:00'
       ) AS hora_salida
FROM HorariosAsignados h
JOIN tmp_fechas_semana f ON f.id_quincena = h.id_quincena
LEFT JOIN horarios_admin ha ON ha.CURP COLLATE latin1_general_ci = h.curp
  AND ha.dia_semana COLLATE latin1_general_ci = f.dia_semana COLLATE latin1_general_ci
WHERE h.id_quincena IN (25, 26, 27, 28)
  AND h.curp IN (SELECT curp FROM tmp_curps)
  AND NOT EXISTS (
      SELECT 1 FROM DetalleHorariosSemana d
      WHERE d.id_horario = h.id_horario AND d.fecha = f.fecha
  );

-- 3) Insertar domingos en DiasDescanso con fecha real
INSERT INTO DiasDescanso (id_horario, id_quincena, dia_semana, fecha_descanso)
SELECT h.id_horario, h.id_quincena, 'Domingo', f.fecha
FROM HorariosAsignados h
JOIN tmp_fechas_semana f ON f.id_quincena = h.id_quincena AND f.dia_semana = 'Domingo'
WHERE h.id_quincena IN (25, 26, 27, 28)
  AND h.curp IN (SELECT curp FROM tmp_curps)
  AND NOT EXISTS (
      SELECT 1 FROM DiasDescanso d
      WHERE d.id_horario = h.id_horario AND d.fecha_descanso = f.fecha
  );

DROP TEMPORARY TABLE IF EXISTS tmp_fechas_semana;
DROP TEMPORARY TABLE IF EXISTS tmp_fechas;
DROP TEMPORARY TABLE IF EXISTS tmp_nums;
DROP TEMPORARY TABLE IF EXISTS tmp_quincenas;
DROP TEMPORARY TABLE IF EXISTS tmp_curps;

UPDATE DetalleHorariosSemana d
JOIN HorariosAsignados h ON h.id_horario = d.id_horario
SET d.hora_entrada = CASE
WHEN d.dia_semana = 'Sábado' THEN '14:00:00'
ELSE '12:00:00'
END,
d.hora_salida = CASE
WHEN d.dia_semana = 'Sábado' THEN '20:00:00'
ELSE '21:00:00'
END
WHERE h.curp = 'POSL950507HYNTLS09'
AND d.dia_semana IN ('Lunes','Martes','Miércoles','Jueves','Viernes','Sábado');

UPDATE horarios_admin
SET hora_entrada = CASE
WHEN dia_semana = 'Sábado' THEN '14:00:00'
ELSE '12:00:00'
END,
hora_salida = CASE
WHEN dia_semana = 'Sábado' THEN '20:00:00'
ELSE '21:00:00'
END
WHERE CURP = 'POSL950507HYNTLS09'
AND dia_semana IN ('Lunes','Martes','Miércoles','Jueves','Viernes','Sábado');