# ============================================================
# 10 — Tracer-GOV: public procurement audit trail
#
# Colab:  !pip install winnex-madhava winnex-tracer
# ============================================================

# instalação automática — Colab, Jupyter e script local.
# No Colab, "!pip" dentro de comentário não executa: a instalação
# precisa acontecer de dentro da célula, antes dos imports.
import importlib
import subprocess
import sys

for _pkg in ["winnex-madhava", "winnex-tracer"]:
    _mod = _pkg.replace("-", "_")
    try:
        __import__(_mod)
        continue
    except ImportError:
        pass
    _r = subprocess.run(
        [sys.executable, "-m", "pip", "install", "-q", "--upgrade", _pkg],
        capture_output=True, text=True
    )
    # O interpretador do Colab já está em execução quando o pip termina.
    # Sem invalidar o cache, o import abaixo pode não enxergar o pacote.
    importlib.invalidate_caches()
    try:
        __import__(_mod)
    except ImportError:
        sys.stderr.write(_r.stdout or "")
        sys.stderr.write(_r.stderr or "")
        raise SystemExit(
            "\n\nNão foi possível importar " + _pkg + " após instalar.\n"
            "No Colab: menu 'Ambiente de execução' -> 'Reiniciar sessão',\n"
            "e execute esta célula novamente.\n"
        )

import random
import numpy as np
import winnex_madhava as mad
from winnex_tracer.core import InstrumentedEngine

DIM = 128
random.seed(7)

def embed(t):
    v = np.zeros(DIM, dtype=np.float32)
    for tok in t.lower().split():
        for i, ch in enumerate(tok):
            v[(ord(ch) * 31 + i * 7) % DIM] += 1.0
    n = np.linalg.norm(v)
    return v / n if n else v

# 1. base de processos licitatórios de um tribunal de contas
modalidades = [
    "pregão eletrônico para aquisição de equipamentos de informática",
    "concorrência pública para obra de pavimentação asfáltica",
    "dispensa de licitação por emergência em unidade de saúde",
    "credenciamento de serviços de manutenção predial",
    "pregão para fornecimento de merenda escolar",
    "tomada de preços para projeto de engenharia",
    "inexigibilidade para contratação de artista consagrado",
    "registro de preços para material de escritório",
]
processos = [f"PROC-{i+1:04d} {random.choice(modalidades)}" for i in range(600)]
corpus = np.stack([embed(p) for p in processos]).astype(np.float32)

# 2. instrumenta

base = mad.build_engine(corpus, dim=DIM, k=5, k1_fraction=1.0,
                        postfilter=True, audit_exhaustive=True)
engine = InstrumentedEngine(base, mode="commitment")

# 3. auditoria: "existe algum processo de dispensa sem emergência comprovada?"
consulta = "dispensa de licitação por emergência sem justificativa"
r = engine.search_with_commitment(embed(consulta), k=5)

print(f"processos analisados : {len(processos)}")
print(f"processos retornados : {len(r['indices'])}")
print(f"excluídos com prova  : {r['total_excluded_count']}")
print(f"garantia             : {r['recall_guarantee']}")
print(f"bound violations     : {r['bound_violations']}")

print("\nprocessos apontados:")
for idx in r["indices"][:3]:
    print(f"  {processos[idx][:70]}")

assert r["bound_violations"] == 0
print("\nOK — varredura de 600 processos com prova de completude.")
