<?php
/**
 * api/ver_cert_pdf.php
 * Sirve PDFs de certificados y fichas PPP del estudiante.
 * Compatible con archivos locales Y OneDrive (prefijo "onedrive:").
 *
 * Parámetros GET:
 *   id    → id_certificado (tipo cert_firmado) o id_practica (tipos ficha_*)
 *   tipo  → cert_firmado | ficha_final | ficha_est
 *   dl    → 1 = forzar descarga (Content-Disposition: attachment)
 */
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_ADMIN, ROL_COORDINADOR, ROL_SECRETARIA, ROL_GESTOR_PPP]);

$db       = getDB();
$user     = currentUser();
$id       = (int)($_GET['id']  ?? 0);
$tipo     = trim($_GET['tipo'] ?? '');
$forzarDl = !empty($_GET['dl']);

if (!$id || !in_array($tipo, ['cert_firmado', 'ficha_final', 'ficha_est'])) {
    http_response_code(400); exit('Parámetros inválidos.');
}

$rutaBD     = null;
$nombreArch = 'documento.pdf';

// ── Obtiene la ruta según tipo ────────────────────────────────────
if ($tipo === 'cert_firmado') {
    $st = $db->prepare("
        SELECT c.archivo_pdf_firmado, pr.id_estudiante
        FROM   certificados c
        JOIN   practicas pr ON pr.id_practica = c.id_practica
        WHERE  c.id_certificado = :id AND c.vigente = 1
        LIMIT 1
    ");
    $st->execute([':id' => $id]);
    $row = $st->fetch();
    if (!$row || empty($row['archivo_pdf_firmado'])) {
        http_response_code(404); exit('Certificado no disponible aún.');
    }
    _checkOwner($db, $user, (int)$row['id_estudiante']);
    $rutaBD     = $row['archivo_pdf_firmado'];
    $nombreArch = 'certificado_ppp.pdf';

} elseif ($tipo === 'ficha_final') {
    $st = $db->prepare("SELECT ficha_doc_final, id_estudiante FROM practicas WHERE id_practica = :id LIMIT 1");
    $st->execute([':id' => $id]);
    $row = $st->fetch();
    if (!$row || empty($row['ficha_doc_final'])) {
        http_response_code(404); exit('Ficha final no disponible.');
    }
    _checkOwner($db, $user, (int)$row['id_estudiante']);
    $rutaBD     = $row['ficha_doc_final'];
    $nombreArch = 'ficha_ppp_firmada.pdf';

} elseif ($tipo === 'ficha_est') {
    $st = $db->prepare("SELECT ficha_doc_est, id_estudiante FROM practicas WHERE id_practica = :id LIMIT 1");
    $st->execute([':id' => $id]);
    $row = $st->fetch();
    if (!$row || empty($row['ficha_doc_est'])) {
        http_response_code(404); exit('Ficha no disponible.');
    }
    _checkOwner($db, $user, (int)$row['id_estudiante']);
    $rutaBD     = $row['ficha_doc_est'];
    $nombreArch = 'mi_ficha_ppp.pdf';
}

if (!$rutaBD) { http_response_code(404); exit('Archivo no encontrado.'); }

// ── Sirve el archivo ──────────────────────────────────────────────
if ($forzarDl) {
    // Para descarga forzada: servimos siempre inline pero con attachment
    _servirConDisposicion($rutaBD, $nombreArch, 'attachment');
} else {
    OneDriveStorage::servirArchivo($rutaBD, $nombreArch, 'application/pdf');
}
exit;

// ────────────────────────────────────────────────────────────────
// Helpers
// ────────────────────────────────────────────────────────────────

function _checkOwner(PDO $db, array $user, int $idEstPractica): void
{
    $rol = (int)($user['id_rol'] ?? 0);
    if ($rol === ROL_ESTUDIANTE) {
        $st = $db->prepare("SELECT id_estudiante FROM estudiantes WHERE id_usuario = :u LIMIT 1");
        $st->execute([':u' => $user['id']]);
        $idEstSesion = (int)$st->fetchColumn();
        if ($idEstSesion !== $idEstPractica) {
            http_response_code(403); exit('Acceso denegado.');
        }
    }
}

function _servirConDisposicion(string $rutaBD, string $nombre, string $disp): void
{
    if (OneDriveStorage::esOneDrive($rutaBD)) {
        // Para OneDrive stream el archivo con el header de descarga
        header('Content-Type: application/pdf');
        header('Content-Disposition: ' . $disp . '; filename="' . $nombre . '"');
        OneDriveStorage::stream($rutaBD, $nombre, 'application/pdf');
    } else {
        $rutaAbs = UPLOAD_PATH . DIRECTORY_SEPARATOR
                 . str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $rutaBD);
        if (!file_exists($rutaAbs)) {
            http_response_code(404); exit('Archivo local no encontrado.');
        }
        header('Content-Type: application/pdf');
        header('Content-Disposition: ' . $disp . '; filename="' . $nombre . '"');
        header('Content-Length: ' . filesize($rutaAbs));
        header('Cache-Control: private, max-age=600');
        readfile($rutaAbs);
    }
}
