# ============================================================
# 11 — Tracer-JUS: contract due diligence with proof of exclusion
#
# 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(11)

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. cláusulas de contratos em uma due diligence
tipos_clausula = [
    "cláusula de rescisão antecipada com multa proporcional ao prazo restante",
    "cláusula de confidencialidade com vigência de cinco anos após o término",
    "cláusula de reajuste anual pelo IGP-M ou índice equivalente",
    "cláusula de garantia mediante fiança bancária ou seguro garantia",
    "cláusula arbitral com sede em câmara arbitral de São Paulo",
    "cláusula de limitação de responsabilidade ao valor do contrato",
    "cláusula de não concorrência por dois anos na mesma região",
    "cláusula de foro de eleição na comarca da sede da contratante",
    "cláusula de cessão de direitos mediante anuência escrita",
    "cláusula de força maior excluindo eventos previsíveis",
]
clausulas = [f"CLA-{i+1:04d} {random.choice(tipos_clausula)}" for i in range(500)]
corpus = np.stack([embed(c) for c in clausulas]).astype(np.float32)

# 2. instrumenta

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

# 3. a pergunta que a due diligence faz
consulta = "risco de rescisão antecipada e multa aplicável"
r = engine.search_with_commitment(embed(consulta), k=4)

print(f"cláusulas no repositório : {len(clausulas)}")
print(f"cláusulas de risco       : {len(r['indices'])}")
print(f"excluídas com prova      : {r['total_excluded_count']}")
print(f"garantia                 : {r['recall_guarantee']}")
print(f"bound violations         : {r['bound_violations']}")

print("\ncláusulas que exigem atenção:")
for idx in r["indices"][:3]:
    print(f"  {clausulas[idx][:72]}")

assert r["bound_violations"] == 0
print("\nOK — due diligence com prova de que nenhuma cláusula de risco foi omitida.")
