<?php
// Usar el sistema de sesión seguro centralizado
require_once __DIR__ . '/../config/paths.php';
require_once __DIR__ . '/secure_session.php';
secure_session_start();

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

header('Content-Type: application/json');

// Incluir y usar la función upsert del namespace correcto
require_once __DIR__ . '/db_utils.php';

$logger = SystemLogger::getInstance();

// Verificar autenticación y rol. Solo los roles que pueden editar deben poder guardar.
require_role(['administrador', 'digitador'], true); // true para respuesta AJAX

try {
    $input = json_decode(file_get_contents('php://input'), true);
    // Ahora anio_escolar es un campo requerido y se valida
    if (!$input || !isset($input['alumno_id']) || !isset($input['fecha_matricula']) || !isset($input['grado_id']) || !isset($input['anio_escolar'])) {
        echo json_encode(['success' => false, 'error' => 'Datos incompletos']);
        exit;
    }
    $alumno_id = intval($input['alumno_id']);
    $grado_id = intval($input['grado_id']);
    $fecha_matricula = $input['fecha_matricula'];
    $anio_escolar = intval($input['anio_escolar']); // Usamos el año que viene del frontend, es más confiable

    $pdo->beginTransaction();

    // Lógica de UPSERT manual para evitar problemas con claves únicas
    $stmt_check = $pdo->prepare("SELECT id FROM matriculas WHERE alumno_id = ? AND anio = ?");
    $stmt_check->execute([$alumno_id, $anio_escolar]);
    $existing_matricula = $stmt_check->fetch();

    $matricula_id = null;
    if ($existing_matricula) {
        // Si ya existe, la actualizamos (reactivando si estaba retirada)
        $matricula_id = $existing_matricula['id'];
        $sql = "UPDATE matriculas SET grado_id = ?, fecha_matricula = ?, estado = 'ACTIVA' WHERE id = ?";
        $pdo->prepare($sql)->execute([$grado_id, $fecha_matricula, $matricula_id]);
    } else {
        // Si no existe, la insertamos y obtenemos el nuevo ID
        $sql = 'INSERT INTO matriculas (alumno_id, anio, grado_id, fecha_matricula, estado) VALUES (?, ?, ?, ?, "ACTIVA")';
        $stmt_insert = $pdo->prepare($sql);
        $stmt_insert->execute([$alumno_id, $anio_escolar, $grado_id, $fecha_matricula]);
        $matricula_id = $pdo->lastInsertId();
    }

    // Filtra los datos recibidos para asegurarse de que los campos vacíos se guarden como NULL
    $salud_data = array_filter($input['salud'] ?? [], fn($value) => $value !== null && $value !== '');
    $social_data = array_filter($input['social'] ?? [], fn($value) => $value !== null && $value !== '');

    // Usar la función upsert para salud
    if (!empty($salud_data)) {
        App\DB\upsert($pdo, 'salud_alumno', $salud_data, 'alumno_id', $alumno_id);
    }

    // Usar la función upsert para social
    if (!empty($social_data)) {
        App\DB\upsert($pdo, 'social_alumno', $social_data, 'alumno_id', $alumno_id);
    }

    $pdo->commit();

    // Obtener información del alumno para el log
    $stmt_alumno = $pdo->prepare('SELECT run, CONCAT(nombre, " ", ap_paterno, " ", ap_materno) as nombre_completo FROM alumnos WHERE id = ?');
    $stmt_alumno->execute([$alumno_id]);
    $alumno_info = $stmt_alumno->fetch(PDO::FETCH_ASSOC);

    $alumno_nombre = $alumno_info['nombre_completo'] ?? 'N/A';
    $alumno_run = $alumno_info['run'] ?? 'N/A';

    $logger->data('Información de alumno actualizada', "Alumno: $alumno_nombre (RUN: $alumno_run), Año escolar: $anio_escolar, Grado: $grado_id");

    echo json_encode([
        'success' => true,
        'anio_escolar' => $anio_escolar,
        'matricula_id' => $matricula_id // Devolvemos el ID de la matrícula creada/actualizada
    ]);
} catch (Throwable $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    $logger->error('Error al guardar información de alumno', "Error: " . $e->getMessage() . ", Alumno ID: " . ($alumno_id ?? 'N/A'));
    http_response_code(500);
    // En producción, es mejor registrar el error en un archivo y no mostrar el 'trace' al cliente.
    echo json_encode([
        'success' => false,
        'error' => 'Ocurrió un error en el servidor. Revise los logs para más detalles. Mensaje: ' . $e->getMessage()
    ]);
}
