<?php
declare(strict_types=1);

require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/conexao.php';

if ($mysqli instanceof mysqli) {
    $mysqli->set_charset('utf8mb4');
}

$osId = filter_input(
    INPUT_GET,
    'os_id',
    FILTER_VALIDATE_INT
) ?: 0;

if ($osId <= 0) {
    http_response_code(400);
    exit('Ordem de serviço inválida.');
}

$stmt = $mysqli->prepare("
    SELECT
        arquivo,
        nome_original,
        mime_type,
        tamanho_bytes,
        hash_sha256
    FROM os_termos_assinados
    WHERE os_id = ?
      AND ativo = 1
    ORDER BY id DESC
    LIMIT 1
");

if (!$stmt) {
    http_response_code(500);
    exit('Não foi possível consultar o documento.');
}

$stmt->bind_param('i', $osId);
$stmt->execute();

$documento = $stmt->get_result()->fetch_assoc();
$stmt->close();

if (!$documento) {
    http_response_code(404);
    exit('Nenhum termo assinado foi anexado para esta OS.');
}

$raiz = realpath(
    __DIR__ . DIRECTORY_SEPARATOR .
    'uploads' . DIRECTORY_SEPARATOR .
    'termos_assinados'
);

$caminho = realpath(
    __DIR__ . DIRECTORY_SEPARATOR .
    str_replace(
        '/',
        DIRECTORY_SEPARATOR,
        (string) $documento['arquivo']
    )
);

if (
    $raiz === false ||
    $caminho === false ||
    !is_file($caminho) ||
    !str_starts_with(
        $caminho,
        $raiz . DIRECTORY_SEPARATOR
    )
) {
    http_response_code(404);
    exit('O arquivo não foi localizado no servidor.');
}

$hashEsperado = trim(
    (string) ($documento['hash_sha256'] ?? '')
);

if (
    $hashEsperado !== '' &&
    !hash_equals(
        $hashEsperado,
        (string) hash_file('sha256', $caminho)
    )
) {
    http_response_code(409);
    exit('A integridade do documento não pôde ser confirmada.');
}

$mime = (string) ($documento['mime_type'] ?? '');
$permitidos = [
    'application/pdf',
    'image/jpeg',
    'image/png'
];

if (!in_array($mime, $permitidos, true)) {
    http_response_code(415);
    exit('Formato de documento não suportado.');
}

$nome = basename(
    (string) ($documento['nome_original'] ?? 'termo_assinado')
);

$nome = preg_replace(
    '/[^A-Za-z0-9._ -]+/u',
    '_',
    $nome
) ?? 'termo_assinado';

$download =
    isset($_GET['download']) &&
    (string) $_GET['download'] === '1';

$disposicao = $download ? 'attachment' : 'inline';

header('Content-Type: ' . $mime);
header('Content-Length: ' . filesize($caminho));
header('X-Content-Type-Options: nosniff');
header('Cache-Control: private, no-store, max-age=0');
header('Pragma: no-cache');
header(
    'Content-Disposition: ' .
    $disposicao .
    '; filename="' .
    addcslashes($nome, '"\\') .
    '"'
);

$arquivo = fopen($caminho, 'rb');

if ($arquivo === false) {
    http_response_code(500);
    exit('Não foi possível abrir o documento.');
}

fpassthru($arquivo);
fclose($arquivo);
exit;
