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

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

$logger = SystemLogger::getInstance();

// Seguridad: Verificar autenticación y rol
if (!isset($_SESSION['user_id']) || strtolower($_SESSION['rol']) !== 'administrador') {
    http_response_code(403);
    echo json_encode(['success' => false, 'error' => 'Acceso no autorizado.']);
    exit;
}

$input = json_decode(file_get_contents('php://input'), true);

$accion = $input['accion'] ?? '';
$anio_origen = $input['anio_origen'] ?? null;
$anio_destino = $input['anio_destino'] ?? null;
$alumnos = $input['alumnos'] ?? [];

if (empty($accion) || empty($anio_origen) || empty($anio_destino) || empty($alumnos)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'error' => 'Datos incompletos para procesar la promoción.']);
    exit;
}

try {
    $pdo->beginTransaction();

    $conteo_exitoso = 0;

    // --- LÓGICA DE PROMOCIÓN INTELIGENTE ---
    if ($accion === 'promover') {
        // 1. Preparar las consultas una sola vez
        // NOTA: Ya NO cambiamos el estado a PROMOVIDO en el año origen
        // Los alumnos mantienen estado ACTIVA para seguir visibles en el año actual

        // Consulta para obtener datos del grado de origen
        $sql_get_grado_origen = "
            SELECT g.id, g.orden, g.tipo_ensenanza_id 
            FROM matriculas m
            JOIN grados g ON m.grado_id = g.id
            WHERE m.id = ?";
        $stmt_get_grado_origen = $pdo->prepare($sql_get_grado_origen);

        // (La lógica de búsqueda de siguiente grado ahora es dinámica dentro del bucle)

        // Consulta para crear o actualizar la matrícula de destino
        $sql_upsert_destino = "
            INSERT INTO matriculas (alumno_id, anio, grado_id, estado, fecha_matricula)
            VALUES (?, ?, ?, 'PRE-INSCRITO', CURDATE())
            ON DUPLICATE KEY UPDATE
                grado_id = VALUES(grado_id),
                estado = 'PRE-INSCRITO',
                fecha_matricula = CURDATE()";
        $stmt_upsert_destino = $pdo->prepare($sql_upsert_destino);

        // 2. Iterar sobre cada alumno para promoverlo individualmente
        foreach ($alumnos as $alumno) {
            $matricula_origen_id = $alumno['matricula_id_origen'];

            // 1. Obtener datos del grado actual (id, orden, tipo_ensenanza_id)
            $stmt_get_grado_origen->execute([$matricula_origen_id]);
            $grado_actual = $stmt_get_grado_origen->fetch(PDO::FETCH_ASSOC);

            if (!$grado_actual) {
                $logger->error('Promoción de alumno', "No se encontró grado para matrícula ID {$matricula_origen_id}");
                continue;
            }

            $grado_origen_id = $grado_actual['id'];
            $orden_actual = $grado_actual['orden'];
            $tipo_actual = $grado_actual['tipo_ensenanza_id'];
            $siguiente_grado_id = null;

            // 2. Lógica Robusta de Promoción

            // A) Buscar siguiente grado en el MISMO nivel (mismo tipo_ensenanza)
            // Busca el grado con el menor orden que sea mayor al actual
            $stmt_mismo_nivel = $pdo->prepare("SELECT id FROM grados WHERE tipo_ensenanza_id = ? AND orden > ? ORDER BY orden ASC LIMIT 1");
            $stmt_mismo_nivel->execute([$tipo_actual, $orden_actual]);
            $siguiente_grado_id = $stmt_mismo_nivel->fetchColumn();

            // B) Si no hay siguiente en el mismo nivel, buscar en el SIGUIENTE nivel
            if (!$siguiente_grado_id) {
                // Buscar el siguiente tipo de enseñanza (asumiendo IDs progresivos o buscando el siguiente mayor)
                $stmt_next_tipo = $pdo->prepare("SELECT id FROM tipo_ensenanza WHERE id > ? ORDER BY id ASC LIMIT 1");
                $stmt_next_tipo->execute([$tipo_actual]);
                $next_tipo_id = $stmt_next_tipo->fetchColumn();

                if ($next_tipo_id) {
                    // Buscar el primer grado del siguiente nivel (menor orden)
                    $stmt_primer_grado = $pdo->prepare("SELECT id FROM grados WHERE tipo_ensenanza_id = ? ORDER BY orden ASC LIMIT 1");
                    $stmt_primer_grado->execute([$next_tipo_id]);
                    $siguiente_grado_id = $stmt_primer_grado->fetchColumn();
                }
            }

            // Log de debug para diagnóstico
            $logger->debug(
                'Promoción de alumno - Debug',
                "Alumno ID {$alumno['alumno_id']}: matricula_origen_id={$matricula_origen_id}, " .
                    "grado_origen_id={$grado_origen_id}, siguiente_grado_id=" . ($siguiente_grado_id ?: 'NULL')
            );

            if (!$siguiente_grado_id) {
                // Si no hay un siguiente grado (ej. 8vo básico = grado 10), el alumno está en el último año
                // No se crea matrícula para el año siguiente porque se va a liceo
                $logger->info(
                    'Promoción de alumno',
                    "Alumno ID {$alumno['alumno_id']} está en el último grado (grado_id={$grado_origen_id}). " .
                        "No se crea matrícula para año siguiente (alumno egresa). Usuario: {$_SESSION['usuario']}"
                );
                $conteo_exitoso++;
                continue; // Pasar al siguiente alumno
            }

            // Crear la pre-matrícula en el grado y año de destino correctos
            // NOTA: Ya NO actualizamos el estado de la matrícula origen
            // El alumno mantiene estado ACTIVA en el año actual para seguir visible
            $stmt_upsert_destino->execute([$alumno['alumno_id'], $anio_destino, $siguiente_grado_id]);
            $conteo_exitoso++;
        }

        $mensaje = "$conteo_exitoso alumnos promovidos exitosamente al año $anio_destino.";
        $logger->data('Promoción de alumnos', "$mensaje Usuario: {$_SESSION['usuario']}");
    } elseif ($accion === 'no_sigue') {
        // Actualizar la matrícula de origen a 'NO SIGUE'
        $sql_update = "UPDATE matriculas SET estado = 'NO SIGUE' WHERE id = ?";
        $stmt_update = $pdo->prepare($sql_update);

        foreach ($alumnos as $alumno) {
            $stmt_update->execute([$alumno['matricula_id_origen']]);
            $conteo_exitoso++;
        }

        $mensaje = "$conteo_exitoso alumnos marcados como 'NO SIGUE' para el año $anio_destino.";
        $logger->data('Gestión de promoción', "$mensaje Usuario: {$_SESSION['usuario']}");
    } else {
        throw new Exception('Acción no válida.');
    }

    $pdo->commit();

    echo json_encode([
        'success' => true,
        'message' => $mensaje
    ]);
} catch (Exception $e) {
    $pdo->rollBack();
    $logger->error('Error en promoción de alumnos', $e->getMessage());
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Error en el servidor: ' . $e->getMessage()
    ]);
}
