<?php

declare(strict_types=1);

header('Content-Type: application/json; charset=utf-8');
header('X-Content-Type-Options: nosniff');

try {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        respond(405, ['mensagem' => 'Metodo nao permitido.']);
    }

    $path = parse_url((string)($_SERVER['REQUEST_URI'] ?? ''), PHP_URL_PATH) ?: '';
    if (!in_array($path, ['/api/v1/ciot/emissoes', '/api/v1/ciot/encerramentos'], true)) {
        respond(404, ['mensagem' => 'Endpoint nao encontrado.']);
    }

    $payload = json_decode(file_get_contents('php://input') ?: '', true, 512, JSON_THROW_ON_ERROR);
    if (!is_array($payload)) {
        respond(400, ['mensagem' => 'JSON invalido.']);
    }

    if ($path === '/api/v1/ciot/emissoes') {
        foreach (['motorista', 'veiculo', 'frete', 'origem', 'destino'] as $requiredKey) {
            if (!isset($payload[$requiredKey]) || !is_array($payload[$requiredKey])) {
                respond(400, ['mensagem' => 'Campo obrigatorio ausente: ' . $requiredKey]);
            }
        }

        $seed = hash('sha256', json_encode($payload, JSON_THROW_ON_ERROR));
        $ciot = substr(preg_replace('/\D+/', '', base_convert(substr($seed, 0, 12), 16, 10)), 0, 12);
        $protocol = 'HML-' . strtoupper(substr($seed, 12, 12));

        respond(201, [
            'mensagem' => 'CIOT homologacao emitido com sucesso.',
            'ciot' => str_pad($ciot, 12, '0', STR_PAD_LEFT),
            'protocolo' => $protocol,
            'data_emissao' => date(DATE_ATOM),
        ]);
    }

    $ciot = preg_replace('/\D+/', '', (string)($payload['ciot'] ?? ''));
    if ($ciot === '') {
        respond(400, ['mensagem' => 'Numero do CIOT e obrigatorio para encerramento.']);
    }

    respond(200, [
        'mensagem' => 'CIOT homologacao encerrado com sucesso.',
        'ciot' => $ciot,
        'protocolo' => $payload['protocolo'] ?? 'ENC-HML-' . strtoupper(substr(hash('sha256', json_encode($payload, JSON_THROW_ON_ERROR)), 0, 10)),
        'data_encerramento' => $payload['data_encerramento'] ?? date(DATE_ATOM),
        'motivo' => $payload['motivo'] ?? 'ENTREGA_CONCLUIDA',
    ]);
} catch (JsonException) {
    respond(400, ['mensagem' => 'JSON invalido.']);
} catch (Throwable) {
    respond(500, ['mensagem' => 'Erro interno no mock CIOT.']);
}

/**
 * @param array<string, mixed> $payload
 */
function respond(int $statusCode, array $payload): void
{
    http_response_code($statusCode);
    echo json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit;
}
