<?php
/**
 * api/ver_preguntas_complexivo.php
 * Sirve el PDF del banco de preguntas del examen complexivo.
 * Soporta: onedrive:... | nombre solo (legacy sin prefijo) | ruta relativa local
 *
 * GET: ?carrera=ID
 */
require_once __DIR__ . '/../config/app.php';
require_once __DIR__ . '/../config/onedrive.php';
require_once __DIR__ . '/../includes/OneDriveStorage.php';
require_once __DIR__ . '/../includes/auth.php';
require_once __DIR__ . '/../includes/functions.php';

requireRol([ROL_ESTUDIANTE, ROL_COORDINADOR, ROL_ADMIN, ROL_SECRETARIA]);

$db        = getDB();
$user      = currentUser();
$rol       = (int)($user['id_rol'] ?? 0);
$idCarrera = (int)($_GET['carrera'] ?? 0);

if (!$idCarrera) {
    http_response_code(400); exit('Parámetro inválido.');
}

// Estudiante: verificar que pertenece a esa carrera y tiene titulación aprobada
if ($rol === ROL_ESTUDIANTE) {
    $stEst = $db->prepare("
        SELECT e.id_carrera, t.estado, t.modalidad
        FROM   estudiantes e
        LEFT JOIN titulaciones t ON t.id_estudiante = e.id_estudiante
        WHERE  e.id_usuario = :u
        LIMIT 1
    ");
    $stEst->execute([':u' => $user['id']]);
    $estRow = $stEst->fetch();

    if (!$estRow || (int)$estRow['id_carrera'] !== $idCarrera) {
        http_response_code(403); exit('No tienes acceso a este material.');
    }
    if ($estRow['estado'] !== 'aprobado' || $estRow['modalidad'] !== 'examen_complexivo') {
        http_response_code(403); exit('Solo disponible para estudiantes con titulación aprobada en examen complexivo.');
    }
}

// Buscar en BD — sin filtrar por instituto (preguntas_complexivo solo tiene id_carrera)
$st = $db->prepare("
    SELECT pdf_preguntas
    FROM   preguntas_complexivo
    WHERE  id_carrera = :c AND activo = 1
    ORDER  BY updated_at DESC
    LIMIT  1
");
$st->execute([':c' => $idCarrera]);
$row = $st->fetch();

if (!$row || empty($row['pdf_preguntas'])) {
    http_response_code(404);
    echo '<!DOCTYPE html><html><head><meta charset="utf-8">
    <style>body{font-family:Arial,sans-serif;display:flex;align-items:center;
    justify-content:center;height:100vh;margin:0;background:#0d1117;}
    .box{text-align:center;background:#161b22;border:1px solid #30363d;
    padding:40px;border-radius:12px;color:#e6edf3;}
    h2{color:#ff7b72;margin-bottom:8px;}p{color:#8b949e;}</style>
    </head><body><div class="box">
    <h2>📄 Banco de preguntas no disponible</h2>
    <p>El coordinador aún no ha subido el material para tu carrera.</p>
    </div></body></html>';
    exit;
}

$ruta   = $row['pdf_preguntas'];
$nombre = 'banco_preguntas_complexivo.pdf';

// ── CASO 1: Ya tiene prefijo onedrive: → stream directo ──────────
if (OneDriveStorage::esOneDrive($ruta)) {
    OneDriveStorage::servirArchivo($ruta, $nombre, 'application/pdf');
    exit;
}

// ── CASO 2: Solo nombre de archivo o ruta local (legacy) ─────────
// Primero intentar localmente
$soloNombre = basename($ruta); // por si viene con path relativo

$candidatos = [
    BASE_PATH . '/uploads/preguntas_complexivo/' . $soloNombre,
    BASE_PATH . '/assets/uploads/preguntas_complexivo/' . $soloNombre,
    BASE_PATH . '/' . ltrim($ruta, '/'),
];

foreach ($candidatos as $rutaAbs) {
    if (file_exists($rutaAbs)) {
        header('Content-Type: application/pdf');
        header('Content-Disposition: inline; filename="' . $nombre . '"');
        header('Content-Length: ' . filesize($rutaAbs));
        header('Cache-Control: private, max-age=1800');
        readfile($rutaAbs);
        exit;
    }
}

// ── CASO 3: No está local → buscar en OneDrive con ruta construida ─
// OneDriveStorage::upload() guarda en: preguntas_complexivo/{idCarrera}/{nombre}
$rutaOD = 'onedrive:preguntas_complexivo/' . $idCarrera . '/' . $soloNombre;

try {
    OneDriveStorage::stream($rutaOD, $nombre, 'application/pdf');
    exit;
} catch (Throwable $e) {
    // Si tampoco está ahí, informar claramente
    http_response_code(404);
    echo '<!DOCTYPE html><html><head><meta charset="utf-8">
    <style>body{font-family:Arial,sans-serif;display:flex;align-items:center;
    justify-content:center;height:100vh;margin:0;background:#0d1117;}
    .box{text-align:center;background:#161b22;border:1px solid #30363d;
    padding:40px;border-radius:12px;color:#e6edf3;max-width:500px;}
    h2{color:#ff7b72;margin-bottom:8px;}p{color:#8b949e;font-size:13px;}
    code{background:#21262d;padding:3px 8px;border-radius:4px;color:#79c0ff;}</style>
    </head><body><div class="box">
    <h2>⚠️ Archivo no encontrado</h2>
    <p>El archivo <code>' . htmlspecialchars($soloNombre) . '</code> no se encontró ni localmente ni en OneDrive.</p>
    <p>El coordinador debe subir el banco de preguntas nuevamente.</p>
    <p style="font-size:11px;color:#555;">Error técnico: ' . htmlspecialchars($e->getMessage()) . '</p>
    </div></body></html>';
    exit;
}