<?php
declare(strict_types=1);

require_once __DIR__ . '/db.php';

try {
    cadastro_require_auth();
    $pdo = cadastro_pdo();
    $schema = cadastro_schema();
    $qSchema = cadastro_quote_ident($schema);

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

    $limit = isset($_GET['limit']) ? max(1, min(500, (int)$_GET['limit'])) : 100;
    $sql = "
        SELECT id, criado_em, usuario, origem, status, entidade, id_entidade, acao, payload, diferencas, mensagem_erro
          FROM {$qSchema}.historico_edicao_geom
         WHERE sequencial_contribuinte = :seq
         ORDER BY criado_em DESC, id DESC
         LIMIT {$limit}
    ";
    $st = $pdo->prepare($sql);
    $st->execute([':seq' => (int)$seq]);
    $rows = $st->fetchAll() ?: [];

    $items = [];
    foreach ($rows as $row) {
        $diffs = json_decode((string)($row['diferencas'] ?? ''), true);
        if (isset($diffs['changed']) && is_array($diffs['changed'])) {
            foreach ($diffs['changed'] as $campo => $change) {
                $items[] = [
                    'quando' => $row['criado_em'],
                    'usuario' => $row['usuario'],
                    'origem' => $row['origem'],
                    'status' => $row['status'],
                    'campo' => $campo,
                    'de' => $change['before'] ?? '',
                    'para' => $change['after'] ?? '',
                    'info' => $row['mensagem_erro'] ?: (($row['entidade'] ?? '') . ' ' . ($row['acao'] ?? '')),
                ];
            }
        } else {
            $items[] = [
                'quando' => $row['criado_em'],
                'usuario' => $row['usuario'],
                'origem' => $row['origem'],
                'status' => $row['status'],
                'campo' => ($row['entidade'] ?? '') . ' / ' . ($row['acao'] ?? ''),
                'de' => '',
                'para' => '',
                'info' => $row['mensagem_erro'] ?: '',
            ];
        }
    }

    cadastro_out(['success' => true, 'items' => $items, 'total' => count($items), 'schema' => $schema]);
} catch (Throwable $e) {
    cadastro_out(['success' => false, 'error' => 'Erro ao listar histórico: ' . $e->getMessage()], 500);
}
