<?php
// file.php - Servir archivos de forma segura con URL ofuscada o token cifrado
// - file.php?f=base64_encode('media/archivo.ext')
// - file.php?t=TOKEN (archivo único cifrado)
// - file.php?t=TOKEN_CARPETA&rel=ruta/interior.pdf (solo rutas bajo la carpeta compartida)

ini_set('display_errors', 0);
error_reporting(0);

require_once __DIR__ . '/includes/path_security.php';
require_once __DIR__ . '/includes/share_crypto.php';

$mediaDir = realpath(__DIR__ . '/media');
if ($mediaDir === false) {
    http_response_code(500);
    die('Directorio media no disponible');
}

/**
 * Sirve un archivo local tras validar que está bajo una raíz permitida (media + whitelist).
 */
function grid_file_serve_path($realPath, $asAttachment = false) {
    if ($realPath === false || !is_file($realPath)) {
        http_response_code(404);
        die('Archivo no encontrado');
    }
    $rp = realpath($realPath);
    $chk = validarRutaSegura($rp !== false ? $rp : (string) $realPath);
    if ($rp === false || !$chk['ok']) {
        http_response_code(403);
        die('Acceso denegado: fuera del directorio media');
    }
    $rp = $chk['real'];

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimeType = $finfo ? finfo_file($finfo, $rp) : '';
    if ($finfo) {
        finfo_close($finfo);
    }
    if (!$mimeType) {
        $mimeType = 'application/octet-stream';
    }

    $disp = $asAttachment ? 'attachment' : 'inline';
    header('Content-Type: ' . $mimeType);
    header('Content-Length: ' . filesize($rp));
    header('Content-Disposition: ' . $disp . '; filename="' . basename($rp) . '"');
    header('Cache-Control: private, max-age=86400');
    header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 86400) . ' GMT');
    readfile($rp);
    exit;
}

// --- Token cifrado (compartir seguro) ---
if (isset($_GET['t']) && $_GET['t'] !== '') {
    $wantDownload = isset($_GET['download']) && ($_GET['download'] === '1' || $_GET['download'] === 'true' || $_GET['download'] === 'yes');
    $payload = grid_share_unpack_token($_GET['t']);
    if (!$payload || !isset($payload['kind'])) {
        http_response_code(403);
        die('Enlace inválido o caducado');
    }

    if ($payload['kind'] === 'file' && isset($payload['mediaPath'])) {
        $real = grid_share_resolve_under_media($payload['mediaPath']);
        grid_file_serve_path($real, $wantDownload);
    }

    if ($payload['kind'] === 'folder' && isset($payload['rootMediaPath'])) {
        $relInside = isset($_GET['rel']) ? (string)$_GET['rel'] : '';
        $relInside = str_replace(["\0", '\\'], ['', '/'], $relInside);
        $relInside = ltrim($relInside, '/');
        if (strpos($relInside, '..') !== false) {
            http_response_code(403);
            die('Ruta no permitida');
        }
        $rootReal = grid_share_resolve_under_media($payload['rootMediaPath']);
        if ($rootReal === false || !is_dir($rootReal)) {
            http_response_code(404);
            die('Carpeta no encontrada');
        }
        $parts = array_values(array_filter(explode('/', $relInside), function ($p) {
            return $p !== '' && $p !== '.' && $p !== '..';
        }));
        $suffix = implode(DIRECTORY_SEPARATOR, $parts);
        $candidate = $suffix === '' ? $rootReal : ($rootReal . DIRECTORY_SEPARATOR . $suffix);
        $realFile = realpath($candidate);
        if ($realFile === false || !is_file($realFile) || !grid_share_file_under_folder($rootReal, $realFile)) {
            http_response_code(403);
            die('Acceso denegado');
        }
        grid_file_serve_path($realFile, $wantDownload);
    }

    http_response_code(400);
    die('Solicitud inválida');
}

// --- Parámetro clásico f= ---
if (!isset($_GET['f']) || empty($_GET['f'])) {
    http_response_code(400);
    die('Solicitud inválida: falta parámetro f o t');
}

$encoded = $_GET['f'];
$decoded = base64_decode($encoded, true);

if (!$decoded) {
    http_response_code(400);
    die('Solicitud inválida: parámetro f no válido');
}

$decoded = str_replace(['\\', "\0"], ['/', ''], $decoded);
if (stripos($decoded, 'media/') === 0) {
    $candidate = __DIR__ . '/' . ltrim($decoded, '/');
} elseif (!preg_match('#^([a-zA-Z]:[\\\\/]|/)#', $decoded)
    && (stripos($decoded, 'flexia disk/') === 0 || strcasecmp($decoded, 'flexia disk') === 0)) {
    $candidate = __DIR__ . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $decoded);
} else {
    $candidate = $decoded;
}
$realPath = realpath($candidate);

$classicChk = validarRutaSegura($realPath !== false ? $realPath : $candidate);
if ($realPath === false || !$classicChk['ok']) {
    http_response_code(403);
    die('Acceso denegado: fuera del directorio media');
}
$realPath = $classicChk['real'];

if (!file_exists($realPath)) {
    http_response_code(404);
    die('Archivo no encontrado');
}

$wantDownloadClassic = isset($_GET['download']) && ($_GET['download'] === '1' || $_GET['download'] === 'true' || $_GET['download'] === 'yes');
grid_file_serve_path($realPath, $wantDownloadClassic);
