<?php
session_start();
header('Content-Type: application/json');

// Roles autorizados para este endpoint
$roles_permitidos = ['administrador', 'convivencia', 'inspector', 'digitador'];
$rol_usuario = strtolower($_SESSION['rol'] ?? '');

// Verificar si el usuario está logueado y tiene un rol permitido
if (!isset($_SESSION['user_id']) || !in_array($rol_usuario, $roles_permitidos)) {
    http_response_code(403); // Forbidden
    echo json_encode(['error' => 'Acceso denegado. No tiene los permisos necesarios.']);
    exit;
}

require_once __DIR__ . '/../config/db_auto.php';

$query = trim($_GET['q'] ?? '');

if (strlen($query) < 3) {
    echo json_encode([]); // Devolver un array vacío si la búsqueda es muy corta
    exit;
}

// Detectar si el query parece un RUN (solo números, puntos, guiones y k/K)
$isRunSearch = preg_match('/^[0-9\.\-kK]+$/', $query);

try {
    // Aumentar el límite de GROUP_CONCAT para evitar truncamiento de datos si un alumno tiene muchos familiares.
    $pdo->query("SET SESSION group_concat_max_len = 1000000");

    if ($isRunSearch) {
        // 🔎 Búsqueda SOLO por RUN
        $run_clean       = preg_replace('/[^0-9kK]/', '', $query);
        $search_run      = "%{$query}%";         // por formato original
        $search_run_clean = "%{$run_clean}%";    // sin puntos ni guiones

        $sql = "
            SELECT
                a.id AS alumno_id,
                a.run AS alumno_run,
                a.nombre AS alumno_nombre,
                a.ap_paterno AS alumno_ap_paterno,
                a.ap_materno AS alumno_ap_materno,
                g.nombre AS grado_nombre,
                m.id as matricula_id,
                GROUP_CONCAT(
                    DISTINCT JSON_OBJECT(
                        'nombre', f.nombre,
                        'ap_paterno', f.ap_paterno,
                        'ap_materno', f.ap_materno,
                        'telefono', f.telefono,
                        'telefono2', f.telefono2,
                        'email', f.email,
                        'rol', af.tipo_relacion,
                        'parentesco', COALESCE(af.parentesco_especifico, f.parentesco)
                    ) SEPARATOR '|||'
                ) AS familiares_json
            FROM alumnos a
            LEFT JOIN alumno_familiar af ON a.id = af.alumno_id
            LEFT JOIN familiares f ON af.familiar_id = f.id
            LEFT JOIN matriculas m ON a.id = m.alumno_id AND m.estado = 'ACTIVA' AND m.anio = YEAR(CURDATE())
            LEFT JOIN grados g ON m.grado_id = g.id
            WHERE 
                (a.run LIKE :search_run OR REPLACE(a.run, '-', '') LIKE :search_run_clean)
            GROUP BY a.id
            ORDER BY a.ap_paterno, a.ap_materno, a.nombre
            LIMIT 15
        ";

        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            ':search_run'       => $search_run,
            ':search_run_clean' => $search_run_clean,
        ]);
    } else {
        // 🔎 Búsqueda SOLO por nombres / apellidos
        $search_term = "%" . strtoupper($query) . "%";

        $sql = "
            SELECT
                a.id AS alumno_id,
                a.run AS alumno_run,
                a.nombre AS alumno_nombre,
                a.ap_paterno AS alumno_ap_paterno,
                a.ap_materno AS alumno_ap_materno,
                g.nombre AS grado_nombre,
                m.id as matricula_id,
                GROUP_CONCAT(
                    DISTINCT JSON_OBJECT(
                        'nombre', f.nombre,
                        'ap_paterno', f.ap_paterno,
                        'ap_materno', f.ap_materno,
                        'telefono', f.telefono,
                        'telefono2', f.telefono2,
                        'email', f.email,
                        'rol', af.tipo_relacion,
                        'parentesco', COALESCE(af.parentesco_especifico, f.parentesco)
                    ) SEPARATOR '|||'
                ) AS familiares_json
            FROM alumnos a
            LEFT JOIN alumno_familiar af ON a.id = af.alumno_id
            LEFT JOIN familiares f ON af.familiar_id = f.id
            LEFT JOIN matriculas m ON a.id = m.alumno_id AND m.estado = 'ACTIVA' AND m.anio = YEAR(CURDATE())
            LEFT JOIN grados g ON m.grado_id = g.id
            WHERE 
                UPPER(a.nombre) LIKE :search_name OR
                UPPER(a.ap_paterno) LIKE :search_paterno OR
                UPPER(a.ap_materno) LIKE :search_materno
            GROUP BY a.id
            ORDER BY a.ap_paterno, a.ap_materno, a.nombre
            LIMIT 15
        ";

        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            ':search_name'     => $search_term,
            ':search_paterno'  => $search_term,
            ':search_materno'  => $search_term,
        ]);
    }

    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // Procesar el JSON agrupado → convertirlo en array de familiares
    foreach ($results as $key => $row) {
        $familiares = [];
        if (!empty($row['familiares_json'])) {
            $json_parts = explode('|||', $row['familiares_json']);
            foreach ($json_parts as $part) {
                $decoded_part = json_decode($part, true);
                if ($decoded_part !== null) {
                    $familiares[] = $decoded_part;
                }
            }
        }
        $results[$key]['familiares'] = $familiares;
        unset($results[$key]['familiares_json']);
    }

    echo json_encode($results);
} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode(['error' => 'Error del servidor: ' . $e->getMessage()]);
}
