"""Gera fontes/todas_as_fontes.csv, o índice único de todas as fontes do projeto.

Uso:
    python3 scripts/consolidar_fontes.py

O índice é derivado: não edite à mão. Cada fonte continua registrada no lugar de origem,
e o script junta tudo numa tabela só:

    fichas de indicador   fontes/fichas/<tema>/*.md          tipo "serie"
    manifestos            dados/brutos/<fonte>/manifesto.csv tipo "arquivo_bruto"
    registro de fontes    fontes/registro/<tema>.csv         tipo "documento"
    eventos               eventos/<tema>.csv                 tipo "ato_oficial" ou "evento"
"""

import csv
import re
from collections import Counter, defaultdict

from comum import BRUTOS, FICHAS, RAIZ, escrever_csv, ler_csv, ler_ficha

CAMPOS = ["id", "tipo", "tema", "titulo", "autor_orgao", "nivel", "url", "url_arquivada",
          "data", "sha256", "registrado_em", "usado_em"]
# pastas de brutos que ainda não aparecem na seção de extração de nenhuma ficha
TEMA_DA_PASTA = {"comexstat": "politica_externa", "ndb": "politica_externa", "tse": "site"}


def fichas():
    linhas, usos = [], defaultdict(set)
    for caminho in sorted(FICHAS.glob("*/*.md")):
        f = ler_ficha(caminho)
        rel = str(caminho.relative_to(RAIZ))
        linhas.append({"id": f"serie:{f['tema']}/{f['id']}", "tipo": "serie", "tema": f["tema"],
                       "titulo": f["nome"], "autor_orgao": f.get("fonte", ""), "nivel": f.get("nivel_fonte", ""),
                       "url": f.get("link", ""), "registrado_em": rel,
                       "usado_em": f"{f['id']} ({f.get('codigo_serie', '')})"})
        # arquivos brutos citados na seção de extração da ficha
        for bruto in re.findall(r"`dados/brutos/([^`]+)`", caminho.read_text(encoding="utf-8")):
            usos[bruto].add((f["tema"], f["id"]))
    return linhas, usos


def manifestos(usos):
    linhas = []
    for manifesto in sorted(BRUTOS.glob("*/manifesto.csv")):
        pasta = manifesto.parent.name
        for m in ler_csv(manifesto):
            chave = f"{pasta}/{m['arquivo']}"
            quem = sorted(usos.get(chave, set()))
            temas = sorted({t for t, _ in quem}) or [TEMA_DA_PASTA.get(pasta, "")]
            linhas.append({"id": f"bruto:{chave}", "tipo": "arquivo_bruto", "tema": ";".join(temas),
                           "titulo": m["arquivo"], "url": m["consulta_url"], "data": m["data_extracao"][:10],
                           "sha256": m["sha256"], "registrado_em": str(manifesto.relative_to(RAIZ)),
                           "usado_em": ";".join(i for _, i in quem)})
    return linhas


def registro():
    linhas = []
    for caminho in sorted((RAIZ / "fontes" / "registro").glob("*.csv")):
        tema = caminho.stem
        for r in ler_csv(caminho):
            linhas.append({"id": f"doc:{r.get('id', '')}", "tipo": "documento", "tema": tema,
                           "titulo": r.get("titulo", ""), "autor_orgao": r.get("autor_orgao", ""),
                           "nivel": r.get("nivel", ""), "url": r.get("url", ""),
                           "url_arquivada": r.get("url_arquivada", ""),
                           "data": r.get("data_documento", "") or r.get("data_acesso", ""),
                           "registrado_em": str(caminho.relative_to(RAIZ)), "usado_em": r.get("usado_em", "")})
    return linhas


def eventos():
    linhas = []
    for caminho in sorted((RAIZ / "eventos").glob("*.csv")):
        n = Counter()
        for e in ler_csv(caminho):
            if not e.get("fonte_url"):
                continue
            n[e["data"]] += 1
            linhas.append({"id": f"evento:{caminho.stem}/{e['data']}-{n[e['data']]}",
                           "tipo": "ato_oficial" if e.get("ato_oficial") else "evento",
                           "tema": e.get("tema") or caminho.stem,
                           "titulo": (e.get("ato_oficial") + ": " if e.get("ato_oficial") else "") + e.get("evento", ""),
                           "nivel": e.get("fonte_nivel", ""), "url": e["fonte_url"],
                           "url_arquivada": e.get("url_arquivada", ""), "data": e["data"],
                           "registrado_em": str(caminho.relative_to(RAIZ)), "usado_em": e.get("governo", "")})
    return linhas


def main():
    series, usos = fichas()
    todas = series + manifestos(usos) + registro() + eventos()
    escrever_csv(RAIZ / "fontes" / "todas_as_fontes.csv", CAMPOS, [[l.get(c, "") for c in CAMPOS] for l in todas])
    print(f"{len(todas)} fontes -> fontes/todas_as_fontes.csv")
    for (tipo, tema), qtd in sorted(Counter((l["tipo"], l["tema"]) for l in todas).items()):
        print(f"  {tipo:14s} {tema or '-':18s} {qtd}")
    urls = {l["url"] for l in todas if l["url"]}
    arquivadas = sum(1 for l in todas if l.get("url_arquivada"))
    print(f"  URLs distintas: {len(urls)} · com cópia no Wayback: {arquivadas}")


if __name__ == "__main__":
    main()
