<?php
// get_horario_area_mes.php - Devuelve los horarios asignados de un área administrativa para un mes dado
header('Content-Type: application/json');
require_once __DIR__ . '/../config/database.php';

$year = isset($_GET['year']) ? intval($_GET['year']) : date('Y');
$month = isset($_GET['month']) ? intval($_GET['month']) : date('n');
$area = isset($_GET['area']) ? trim($_GET['area']) : '';

if (!$area) {
    echo json_encode(['success' => false, 'error' => 'Área no especificada']);
    exit;
}

try {
    $db = (new Database())->connect();
    $query = '
        SELECT h.id_horario, h.curp, p.NOMBRES, p.`APELLIDO PATERNO`, p.`APELLIDO MATERNO`, a.area, q.fecha_inicio, q.fecha_fin, d.semana, d.dia_semana, d.hora_entrada, d.hora_salida
        FROM miembros_area_admin ma
        JOIN areas_admin a ON a.id = ma.area_id
        JOIN Plantilla p ON ma.curp = p.CURP
        JOIN HorariosAsignados h ON h.curp = p.CURP
        JOIN Quincenas q ON h.id_quincena = q.id_quincena
        JOIN DetalleHorariosSemana d ON h.id_horario = d.id_horario
        WHERE q.anio = :year AND q.mes = :month AND a.area = :area
    ';
    $stmt = $db->prepare($query);
    $stmt->bindParam(':year', $year, PDO::PARAM_INT);
    $stmt->bindParam(':month', $month, PDO::PARAM_INT);
    $stmt->bindParam(':area', $area);
    $stmt->execute();
    $horarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $ids = array_column($horarios, 'id_horario');
    $descansosPorHorario = [];
    if (count($ids) > 0) {
        $in = implode(',', array_fill(0, count($ids), '?'));
        $stmtDesc = $db->prepare('SELECT id_horario, dia_semana, fecha_descanso FROM DiasDescanso WHERE id_horario IN (' . $in . ')');
        $stmtDesc->execute($ids);
        foreach ($stmtDesc->fetchAll(PDO::FETCH_ASSOC) as $desc) {
            $descansosPorHorario[$desc['id_horario']][] = $desc;
        }
    }

    $agrupados = [];
    foreach ($horarios as $h) {
        $id = $h['id_horario'];
        if (!isset($agrupados[$id])) {
            $agrupados[$id] = [
                'id_horario' => $h['id_horario'],
                'curp' => $h['curp'],
                'NOMBRES' => $h['NOMBRES'],
                'APELLIDO PATERNO' => $h['APELLIDO PATERNO'],
                'APELLIDO MATERNO' => $h['APELLIDO MATERNO'],
                'fecha_inicio' => $h['fecha_inicio'],
                'fecha_fin' => $h['fecha_fin'],
                'dias_trabajo' => [],
                'descansos' => isset($descansosPorHorario[$id]) ? $descansosPorHorario[$id] : [],
                'area' => $h['area']
            ];
        }

        $semana = (int)($h['semana'] ?? 1);
        $inicio = new DateTime($h['fecha_inicio']);
        $fin = new DateTime($h['fecha_fin']);
        $diaSemanaMap = [1=>'Lunes',2=>'Martes',3=>'Miércoles',4=>'Jueves',5=>'Viernes',6=>'Sábado',0=>'Domingo'];
        $diasEnQuincena = [];
        for ($d = clone $inicio; $d <= $fin; $d->modify('+1 day')) {
            $diaNombre = $diaSemanaMap[(int)$d->format('w')];
            $diasEnQuincena[] = [
                'fecha' => $d->format('Y-m-d'),
                'dia_semana' => $diaNombre
            ];
        }
        $semanasFechas = [[],[],[]];
        $idx = 0;
        $semanaIdx = 0;
        while ($idx < count($diasEnQuincena)) {
            $dia = $diasEnQuincena[$idx];
            $semanasFechas[$semanaIdx][] = $dia;
            if ($dia['dia_semana'] === 'Domingo' && $idx < count($diasEnQuincena)-1) {
                $semanaIdx++;
            }
            $idx++;
        }
        $fechaSemanaDia = null;
        if (isset($semanasFechas[$semana-1])) {
            foreach ($semanasFechas[$semana-1] as $diaObj) {
                if ($diaObj['dia_semana'] === $h['dia_semana']) {
                    $fechaSemanaDia = $diaObj['fecha'];
                    break;
                }
            }
        }
        $fechas = $fechaSemanaDia ? [$fechaSemanaDia] : [];
        $dia = $h['dia_semana'];
        if (!isset($agrupados[$id]['_dias_trabajo_map'])) {
            $agrupados[$id]['_dias_trabajo_map'] = [];
        }
        if (!isset($agrupados[$id]['_dias_trabajo_map'][$semana])) {
            $agrupados[$id]['_dias_trabajo_map'][$semana] = [];
        }
        $nuevoRegistro = [
            'semana' => $semana,
            'dia_semana' => $h['dia_semana'],
            'hora_entrada' => $h['hora_entrada'],
            'hora_salida' => $h['hora_salida'],
            'fechas' => $fechas
        ];
        $yaExiste = isset($agrupados[$id]['_dias_trabajo_map'][$semana][$dia]);
        if ($yaExiste) {
            $existente = $agrupados[$id]['_dias_trabajo_map'][$semana][$dia];
            $nuevoValido = ($nuevoRegistro['hora_entrada'] !== '00:00:00' || $nuevoRegistro['hora_salida'] !== '00:00:00');
            $existenteValido = ($existente['hora_entrada'] !== '00:00:00' || $existente['hora_salida'] !== '00:00:00');
            if ($nuevoValido && !$existenteValido) {
                $agrupados[$id]['_dias_trabajo_map'][$semana][$dia] = $nuevoRegistro;
            }
        } else {
            $agrupados[$id]['_dias_trabajo_map'][$semana][$dia] = $nuevoRegistro;
        }
    }

    foreach ($agrupados as &$agr) {
        if (isset($agr['_dias_trabajo_map'])) {
            if (count($agr['_dias_trabajo_map']) === 1) {
                $semana1 = $agr['_dias_trabajo_map'][1];
                $agr['dias_trabajo'] = [];
                for ($s = 1; $s <= 3; $s++) {
                    foreach ($semana1 as $dia => $info) {
                        $nuevo = $info;
                        $nuevo['semana'] = $s;
                        $agr['dias_trabajo'][] = $nuevo;
                    }
                }
            } else {
                $agr['dias_trabajo'] = [];
                foreach ($agr['_dias_trabajo_map'] as $semana => $diasArr) {
                    foreach ($diasArr as $info) {
                        $agr['dias_trabajo'][] = $info;
                    }
                }
            }
            unset($agr['_dias_trabajo_map']);
        }
    }

    $result = array_values($agrupados);
    echo json_encode(['success' => true, 'horarios' => $result]);
} catch (Exception $e) {
    echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
