<?php
/**
 * api/ver_doc_convalidacion.php
 * Sirve documentos de convalidación PPP.
 * Accesible por: estudiante (sus propios docs), coordinador, secretaria, gestor_ppp, admin.
 *
 * GET: ?solicitud=ID&doc=CON-001
 *
 * Soporta 3 formatos de ruta_archivo en BD:
 *   1. "onedrive:convalidaciones/1/CON-001-..."   → stream desde OneDrive
 *   2. "storage/convalidaciones/1/CON-001-..."    → ruta local antigua (legacy)
 *   3. "convalidaciones/1/CON-001-..."            → ruta relativa a assets/uploads/
 */
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';

// Accesible por múltiples roles
requireRol([ROL_ESTUDIANTE, ROL_COORDINADOR, ROL_SECRETARIA, ROL_GESTOR_PPP, ROL_ADMIN]);

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

$idSolicitud = (int)($_GET['solicitud'] ?? 0);
$codDoc      = trim($_GET['doc'] ?? '');

if (!$idSolicitud || !$codDoc) {
    http_response_code(400);
    exit('Parámetros inválidos.');
}

// ── Buscar el documento ───────────────────────────────────────────
if ($rol === ROL_ESTUDIANTE) {
    // Estudiante: solo puede ver sus propios documentos
    $st = $db->prepare("
        SELECT cd.ruta_archivo, cd.nombre_archivo
        FROM   convalidacion_documentos cd
        JOIN   convalidaciones c  ON c.id_solicitud  = cd.id_solicitud
        JOIN   estudiantes e      ON e.id_estudiante  = c.id_estudiante
        WHERE  cd.id_solicitud = :is
          AND  cd.codigo_doc   = :cod
          AND  e.id_usuario    = :uid
          AND  cd.ruta_archivo IS NOT NULL
        LIMIT  1
    ");
    $st->execute([':is' => $idSolicitud, ':cod' => $codDoc, ':uid' => $user['id']]);
} else {
    // Coordinador / secretaria / gestor / admin: ven cualquier documento
    $st = $db->prepare("
        SELECT cd.ruta_archivo, cd.nombre_archivo
        FROM   convalidacion_documentos cd
        WHERE  cd.id_solicitud = :is
          AND  cd.codigo_doc   = :cod
          AND  cd.ruta_archivo IS NOT NULL
        LIMIT  1
    ");
    $st->execute([':is' => $idSolicitud, ':cod' => $codDoc]);
}

$doc = $st->fetch();

if (!$doc || empty($doc['ruta_archivo'])) {
    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>📄 Documento no encontrado</h2>
    <p>El documento <strong>' . htmlspecialchars($codDoc) . '</strong> aún no ha sido subido.</p>
    <a href="javascript:window.close()" style="color:#2ea8ff;font-size:13px;">Cerrar</a>
    </div></body></html>';
    exit;
}

$ruta       = $doc['ruta_archivo'];
$nombreArch = $doc['nombre_archivo'] ?: ($codDoc . '.pdf');

// ── Detectar formato y servir ─────────────────────────────────────

// Formato 1: OneDrive
if (OneDriveStorage::esOneDrive($ruta)) {
    OneDriveStorage::servirArchivo($ruta, $nombreArch, 'application/pdf');
    exit;
}

// Formato 2: "storage/convalidaciones/..." → mapear a assets/uploads/convalidaciones/
if (str_starts_with($ruta, 'storage/convalidaciones/')) {
    $relativa   = substr($ruta, strlen('storage/'));         // "convalidaciones/1/CON-..."
    $rutaAbs    = UPLOAD_PATH . DIRECTORY_SEPARATOR
                . str_replace('/', DIRECTORY_SEPARATOR, $relativa);

    // Si no existe ahí, intentar también en assets/uploads/ directamente
    if (!file_exists($rutaAbs)) {
        $rutaAbs = BASE_PATH . DIRECTORY_SEPARATOR . 'assets' . DIRECTORY_SEPARATOR
                 . 'uploads' . DIRECTORY_SEPARATOR
                 . str_replace('/', DIRECTORY_SEPARATOR, $relativa);
    }
} elseif (str_starts_with($ruta, 'assets/uploads/')) {
    // Formato con prefijo assets/uploads/
    $rutaAbs = BASE_PATH . DIRECTORY_SEPARATOR
             . str_replace('/', DIRECTORY_SEPARATOR, $ruta);
} else {
    // Formato 3: ruta relativa directa (ej: "convalidaciones/1/CON-...")
    $rutaAbs = UPLOAD_PATH . DIRECTORY_SEPARATOR
             . str_replace('/', DIRECTORY_SEPARATOR, $ruta);
}

if (!file_exists($rutaAbs)) {
    http_response_code(404);
    exit('Archivo no encontrado en el servidor. Ruta: ' . htmlspecialchars($ruta));
}

// Detectar MIME
$ext  = strtolower(pathinfo($nombreArch, PATHINFO_EXTENSION));
$mime = match($ext) {
    'pdf'        => 'application/pdf',
    'jpg','jpeg' => 'image/jpeg',
    'png'        => 'image/png',
    'doc'        => 'application/msword',
    'docx'       => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    default      => 'application/octet-stream',
};

header('Content-Type: ' . $mime);
header('Content-Disposition: inline; filename="' . $nombreArch . '"');
header('Content-Length: ' . filesize($rutaAbs));
header('Cache-Control: private, max-age=3600');
readfile($rutaAbs);
exit;
