"""Empacota o tema Escândalos para o site (D-033 e D-034).

Uso:
    python3 scripts/exportar_escandalos.py

Lê eventos/escandalos_casos.csv (um caso por linha) e eventos/escandalos_atos.csv (os atos
oficiais de cada caso) e grava site/dados/escandalos.js com window.DADOS = {...}. Confere antes:
todo caso tem ao menos um ato, todo ato aponta para um caso existente, o governo é um dos de
metodologia/mandatos.csv e a situação está no vocabulário fechado.
"""

import json

from comum import HOJE, RAIZ, ler_csv, ler_mandatos

SITUACOES = {
    "em investigação", "denúncia oferecida", "réus", "condenação em 1ª instância",
    "condenação em 2ª instância", "condenação no STF ou STJ", "condenação definitiva", "absolvição",
    "anulação", "arquivamento", "prescrição ou extinção", "sanção não penal", "misto",
}  # D-033, item 4, e D-035, item 4
CORTE = "2026-10-06"  # data de corte da pesquisa: a situação de cada caso é a desta data


def main():
    casos = ler_csv(RAIZ / "eventos" / "escandalos_casos.csv")
    atos = ler_csv(RAIZ / "eventos" / "escandalos_atos.csv")
    mandatos = ler_mandatos()
    governos = {m["id"] for m in mandatos}
    ids = {c["id"] for c in casos}
    erros = []
    if len(ids) != len(casos):
        erros.append("ids de caso repetidos")
    for c in casos:
        if c["governo"] not in governos:
            erros.append(f"{c['id']}: governo {c['governo']!r} fora de mandatos.csv")
        if c["situacao"] not in SITUACOES:
            erros.append(f"{c['id']}: situação {c['situacao']!r} fora do vocabulário")
    por_caso = {}
    for a in atos:
        if a["caso_id"] not in ids:
            erros.append(f"ato de {a['data']} aponta para caso inexistente {a['caso_id']!r}")
        por_caso.setdefault(a["caso_id"], []).append(a)
    for c in casos:
        if c["id"] not in por_caso:
            erros.append(f"{c['id']}: caso sem ato oficial")
    if erros:
        raise SystemExit("Erros no tema Escândalos:\n  " + "\n  ".join(erros))

    for c in casos:
        c["atos"] = sorted(por_caso[c["id"]], key=lambda a: a["data"])
    casos.sort(key=lambda c: (c["inicio_fatos"] or "9999", c["caso"]))  # sem data nas fontes: no fim
    dados = {
        "tema": "escandalos", "gerado_em": HOJE.isoformat(), "corte": CORTE,
        "mandatos": [{**m, "inicio": m["inicio"].isoformat(), "fim": m["fim"].isoformat()} for m in mandatos],
        "casos": casos,
    }
    destino = RAIZ / "site" / "dados" / "escandalos.js"
    destino.write_text("window.DADOS = " + json.dumps(dados, ensure_ascii=False, separators=(",", ":")) + ";\n",
                       encoding="utf-8")
    print(f"{destino.relative_to(RAIZ)}: {len(casos)} casos, {len(atos)} atos, {destino.stat().st_size // 1024} KB")


if __name__ == "__main__":
    main()
