<?php
declare(strict_types=1);

require_once 'conexao.php';
require_once 'os_publico_helpers.php';

date_default_timezone_set('America/Sao_Paulo');

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

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

function responder(array $dados, int $status = 200): never
{
    http_response_code($status);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($dados, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    responder(['ok' => false, 'message' => 'Método não permitido.'], 405);
}

$token = strtolower(trim((string) ($_POST['token'] ?? '')));
$csrf = (string) ($_POST['csrf_token'] ?? '');

if (preg_match('/^[a-f0-9]{48,64}$/', $token) !== 1) {
    responder(['ok' => false, 'message' => 'Link inválido.'], 422);
}

$hash = hash('sha256', $token);

if (
    !isset($_SESSION['csrf_os_publico']) ||
    !is_array($_SESSION['csrf_os_publico'])
) {
    $_SESSION['csrf_os_publico'] = [];
}

$csrfSessao = (string) ($_SESSION['csrf_os_publico'][$hash] ?? '');

if ($csrfSessao === '' || $csrf === '' || !hash_equals($csrfSessao, $csrf)) {
    responder(['ok' => false, 'message' => 'A sessão expirou. Atualize a página.'], 419);
}

$stmt = $mysqli->prepare("
    SELECT id, status
    FROM ordens_servico
    WHERE token_acompanhamento = ?
      AND acompanhamento_ativo = 1
    LIMIT 1
");

if (!$stmt) {
    responder(['ok' => false, 'message' => 'Não foi possível consultar a OS.'], 500);
}

$stmt->bind_param('s', $token);
$stmt->execute();
$os = $stmt->get_result()->fetch_assoc();
$stmt->close();

if (!$os) {
    responder(['ok' => false, 'message' => 'Ordem de serviço não encontrada.'], 404);
}

if (osPublicoStatusCodigo((string) $os['status']) !== 'pronto_retirada') {
    responder(['ok' => false, 'message' => 'A ciência está disponível somente quando o equipamento estiver pronto para retirada.'], 409);
}

$osId = (int) $os['id'];

$stmt = $mysqli->prepare("
    SELECT id
    FROM os_atualizacoes_publicas
    WHERE os_id = ?
      AND titulo = 'Ciência do solicitante'
      AND visivel = 0
    LIMIT 1
");

if ($stmt) {
    $stmt->bind_param('i', $osId);
    $stmt->execute();
    $jaExiste = (bool) $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if ($jaExiste) {
        responder(['ok' => true, 'message' => 'A ciência já havia sido registrada.']);
    }
}

try {
    osPublicoRegistrarAtualizacao(
        $mysqli,
        $osId,
        'Ciência do solicitante',
        'O solicitante confirmou que visualizou o aviso de equipamento pronto para retirada.',
        'CIENCIA_RETIRADA',
        'Painel público',
        0
    );

    responder(['ok' => true, 'message' => 'Ciência registrada. A Gerência de Tecnologia foi informada.']);
} catch (Throwable $erro) {
    responder(['ok' => false, 'message' => $erro->getMessage()], 500);
}
