<?php
// ver_archivo.php
// Entrega el contenido de un archivo cargado, SOLO si:
//  1. Hay una sesión activa (requerirLogin), y
//  2. El usuario tiene permiso sobre el documento (dueño de la obra
//     relacionada, o admin).
//
// Todas las referencias a archivos en la interfaz (modal "Ver", enlaces
// de descarga) deben apuntar aquí — nunca directo a uploads/... — porque
// esa carpeta está bloqueada para acceso web directo (ver uploads/.htaccess).

require_once __DIR__ . '/config.php';
require_once __DIR__ . '/lib_documentos.php';
$u = requerirLogin();

$docId = (int)($_GET['id'] ?? 0);
$pdo = db();

$stmt = $pdo->prepare("SELECT * FROM documentos WHERE id = ?");
$stmt->execute([$docId]);
$doc = $stmt->fetch();

if (!$doc || $doc['tipo_carga'] !== 'archivo' || !$doc['archivo_path']) {
    http_response_code(404);
    die('Archivo no encontrado.');
}

if (!usuarioPuedeVerDocumento($pdo, $doc, $u)) {
    http_response_code(403);
    die('No tienes permiso para ver este archivo.');
}

$rutaAbsoluta = __DIR__ . '/' . $doc['archivo_path'];

// Defensa adicional: confirmar que la ruta resuelta sigue dentro de
// uploads/ (evita cualquier truco de path traversal si archivo_path
// llegara a estar corrupto).
$rutaReal = realpath($rutaAbsoluta);
$uploadsReal = realpath(__DIR__ . '/uploads');
if (!$rutaReal || !$uploadsReal || !str_starts_with($rutaReal, $uploadsReal)) {
    http_response_code(404);
    die('Archivo no encontrado.');
}

if (!is_file($rutaReal)) {
    http_response_code(404);
    die('Archivo no encontrado en el servidor.');
}

$mime = function_exists('mime_content_type') ? (mime_content_type($rutaReal) ?: 'application/octet-stream') : 'application/octet-stream';

header('Content-Type: ' . $mime);
header('Content-Disposition: inline; filename="' . basename($doc['archivo_nombre_original'] ?? 'archivo') . '"');
header('Content-Length: ' . filesize($rutaReal));
header('X-Content-Type-Options: nosniff');
header('Cache-Control: private, max-age=0, no-cache');

readfile($rutaReal);
