<?php
declare(strict_types=1);

require_once __DIR__ . '/db.php';

try {
    cadastro_require_write_access();
    $pdo = cadastro_pdo();
    $schema = cadastro_schema();
    $qSchema = cadastro_quote_ident($schema);
    $json = cadastro_read_json();

    $seq = trim((string)($json['sequencial_contribuinte'] ?? ''));
    if ($seq === '' || !preg_match('/^\d+$/', $seq)) {
        cadastro_out(['success' => false, 'error' => 'sequencial_contribuinte numérico é obrigatório'], 400);
    }

    $payload = $json['payload'] ?? null;
    $diffs = $json['diffs'] ?? ($json['diferencas'] ?? null);

    $sql = "
        INSERT INTO {$qSchema}.historico_edicao_geom
            (sequencial_contribuinte, entidade, id_entidade, acao, usuario, origem, wkt_antes, wkt_depois, payload, diferencas, status, mensagem_erro, criado_em)
        VALUES
            (:seq, :entidade, :id_entidade, :acao, :usuario, :origem, :wkt_antes, :wkt_depois, :payload, :diferencas, :status, :mensagem_erro, now())
        RETURNING id
    ";
    $st = $pdo->prepare($sql);
    $st->execute([
        ':seq' => (int)$seq,
        ':entidade' => cadastro_normalize_nullable($json['entidade'] ?? null),
        ':id_entidade' => isset($json['id_entidade']) && $json['id_entidade'] !== null && $json['id_entidade'] !== '' ? (int)$json['id_entidade'] : null,
        ':acao' => cadastro_normalize_nullable($json['acao'] ?? null),
        ':usuario' => cadastro_user(),
        ':origem' => cadastro_normalize_nullable($json['origem'] ?? 'cadastro_editor'),
        ':wkt_antes' => cadastro_normalize_nullable($json['wkt_antes'] ?? null),
        ':wkt_depois' => cadastro_normalize_nullable($json['wkt_depois'] ?? null),
        ':payload' => is_string($payload) ? $payload : json_encode($payload, JSON_UNESCAPED_UNICODE),
        ':diferencas' => is_string($diffs) ? $diffs : json_encode($diffs, JSON_UNESCAPED_UNICODE),
        ':status' => cadastro_normalize_nullable($json['status'] ?? 'OK'),
        ':mensagem_erro' => cadastro_normalize_nullable($json['mensagem_erro'] ?? null),
    ]);
    $id = $st->fetchColumn();
    cadastro_out(['success' => true, 'id' => $id, 'schema' => $schema]);
} catch (Throwable $e) {
    cadastro_out(['success' => false, 'error' => 'Erro ao salvar histórico: ' . $e->getMessage()], 500);
}
