<?php
/**
 * Serve o arquivo da ROM para o emulador.
 * Valida a sessão do cliente e o id do jogo antes de entregar o arquivo.
 */
session_start();

if (!isset($_SESSION['cliente_logado']) || $_SESSION['cliente_logado'] !== true) {
    http_response_code(403);
    exit('Acesso negado.');
}

$id = $_GET['id'] ?? '';
if (!$id) {
    http_response_code(404);
    exit('Jogo não encontrado.');
}

$jogos = json_decode(file_get_contents('../dados/jogos.json'), true) ?? [];
$jogo = null;
foreach ($jogos as $j) {
    if ($j['id'] === $id) {
        $jogo = $j;
        break;
    }
}

if (!$jogo) {
    http_response_code(404);
    exit('Jogo não encontrado.');
}

$caminho = realpath('../dados/uploads/' . $jogo['arquivo']);
$pastaPermitida = realpath('../dados/uploads');

// Garante que o arquivo está dentro da pasta de uploads (proteção contra path traversal)
if (!$caminho || !$pastaPermitida || strpos($caminho, $pastaPermitida) !== 0 || !file_exists($caminho)) {
    http_response_code(404);
    exit('Arquivo não encontrado.');
}

$extensao = strtolower(pathinfo($caminho, PATHINFO_EXTENSION));
$mimes = [
    'nes' => 'application/octet-stream',
    'fds' => 'application/octet-stream',
    'smc' => 'application/octet-stream',
    'sfc' => 'application/octet-stream',
    'gen' => 'application/octet-stream',
    'md' => 'application/octet-stream',
    'sms' => 'application/octet-stream',
    'gg' => 'application/octet-stream',
    'gb' => 'application/octet-stream',
    'gbc' => 'application/octet-stream',
    'gba' => 'application/octet-stream',
    'a26' => 'application/octet-stream',
    'pce' => 'application/octet-stream',
    'zip' => 'application/zip',
    'bin' => 'application/octet-stream',
];

header('Content-Type: ' . ($mimes[$extensao] ?? 'application/octet-stream'));
header('Content-Disposition: inline; filename="' . basename($caminho) . '"');
header('Accept-Ranges: bytes');

$tamanho = filesize($caminho);

// Suporte a Range Requests (necessário para alguns navegadores/emuladores)
if (isset($_SERVER['HTTP_RANGE']) &&
    preg_match('/bytes=(\d+)-(\d*)/', $_SERVER['HTTP_RANGE'], $m)) {

    $inicio = (int)$m[1];
    $fim = ($m[2] !== '') ? (int)$m[2] : ($tamanho - 1);

    if ($inicio >= $tamanho) {
        header('Content-Range: bytes */' . $tamanho);
        http_response_code(416);
        exit;
    }

    $fim = min($fim, $tamanho - 1);
    $comprimento = $fim - $inicio + 1;

    http_response_code(206);
    header('Content-Range: bytes ' . $inicio . '-' . $fim . '/' . $tamanho);
    header('Content-Length: ' . $comprimento);

    $fp = fopen($caminho, 'rb');
    if ($fp === false) {
        http_response_code(500);
        exit('Erro ao abrir a ROM.');
    }

    fseek($fp, $inicio);
    $restante = $comprimento;

    while ($restante > 0 && !feof($fp)) {
        $bloco = fread($fp, min(1024 * 1024, $restante));
        if ($bloco === false || $bloco === '') break;
        echo $bloco;
        $restante -= strlen($bloco);
        if (function_exists('flush')) flush();
    }

    fclose($fp);
    exit;
}

header('Content-Length: ' . $tamanho);
readfile($caminho);
