"""Empacota a checagem do debate para o site (D-036).

Uso:
    python3 scripts/exportar_debate.py

Lê eventos/debates/afirmacoes.csv (a extração, uma linha por afirmação) e
eventos/debates/checagens.csv (a verificação das checáveis) e grava site/dados/debate.js.
Confere antes: toda afirmação checável tem checagem, todo selo está no vocabulário e toda
checagem com selo tem ao menos uma fonte de nível 1 ou 2. Afirmações com selo "sem_dados"
aparecem na página com o rótulo "sem dados suficientes", sem selo, dizendo o que falta (D-038).
"""

import json
import re

from comum import HOJE, RAIZ, ler_csv

DEBATE = {
    "id": "band_2turno_1", "titulo": "1º debate do 2º turno", "emissora": "Band", "data": "2026-10-18",
    "candidatos": {"lula": "Lula", "flavio": "Flávio Bolsonaro"},
    "transcricao": "../dados/brutos/debates/transcricao_band_2turno_1_2026-10-19.md",
}
SELOS = {"verdade", "nao_e_bem_assim", "mentira", "sem_dados"}
RESPOSTAS = {"respondeu", "nao_respondeu"}  # D-039, item 13: na página, só as duas
# Perguntas sem relevância para a decisão de voto (D-041, item 2): provocações pessoais sem conteúdo sobre governo,
# políticas, propostas, conduta pública ou situação legal. Ficam no CSV, fora da página e do contador.
PERGUNTAS_IRRELEVANTES = {
    "p016": "se Lula conhece o próprio filho",
    "p019": "se Flávio acha que já ganhou a eleição",
    "p022": "se Lula conhece Jair Bolsonaro",
    "p023": "se Lula assistiu ao filme sobre Jair Bolsonaro",
    "p028": "voto de presos em Lula (resultado eleitoral; mesma regra da afirmação a104)",
    "p029": "se um policial votou em Flávio (voto individual, secreto)",
    "p032": "se o filho de Lula votou nele (voto individual, secreto)",
    "p034": "quantas armas Flávio tem em casa (posse pessoal, sem relação com proposta ou conduta pública)",
}


def main():
    pasta = RAIZ / "eventos" / "debates"
    afirmacoes = {a["id"]: a for a in ler_csv(pasta / "afirmacoes.csv")}
    checagens = {c["id"]: c for c in ler_csv(pasta / "checagens.csv")}
    erros = []
    for aid, a in afirmacoes.items():
        if a["checavel"] == "sim" and aid not in checagens:
            erros.append(f"{aid}: afirmação checável sem checagem")
    itens, sem_dados = [], []
    for aid, c in checagens.items():
        a = afirmacoes.get(aid)
        if not a:
            erros.append(f"{aid}: checagem sem afirmação")
            continue
        if c["selo"] not in SELOS:
            erros.append(f"{aid}: selo {c['selo']!r} fora do vocabulário")
            continue
        fontes = [{"titulo": c[f"fonte{i}_titulo"], "url": c[f"fonte{i}_url"], "nivel": c[f"fonte{i}_nivel"]}
                  for i in (1, 2, 3) if c.get(f"fonte{i}_url")]
        # nível R: registro integral de uma fala, aceito só para atribuição de fala (D-036, item 8)
        aceitos = ("1", "2", "R") if a["tipo"] == "atribuição" else ("1", "2")
        if c["selo"] != "sem_dados" and not any(f["nivel"] in aceitos for f in fontes):
            erros.append(f"{aid}: selo sem fonte de nível 1 ou 2")
        if c.get("relevancia", "").startswith("irrelevante"):
            continue  # fora da página e do contador; fica no CSV e nas notas (D-041)
        if c["selo"] == "sem_dados":
            sem_dados.append({"id": aid, "candidato": a["candidato"], "tema": a["tema"]})
        externas = []
        for parte in filter(None, (p.strip() for p in c.get("checagens_externas", "").split(" ; "))):
            veiculo, selo, url = (parte.split("|") + ["", ""])[:3]
            if url.startswith("http"):
                externas.append({"veiculo": veiculo.strip(), "selo": selo.strip(), "url": url.strip()})
        itens.append({
            "id": aid, "candidato": a["candidato"], "bloco": a["bloco"].split(" | ")[0], "tema": a["tema"],
            "trechos": a["trecho"].split(" | "), "afirmacao": a["afirmacao"], "selo": c["selo"],
            "resumo": c["resumo"], "explicacao": c["explicacao"], "fontes": fontes,
            "pagina_site": c.get("pagina_site", ""), "externas": externas, "observacao": c.get("observacao", ""),
        })
    perguntas = []
    arquivo_perguntas = pasta / "perguntas.csv"
    if arquivo_perguntas.exists():
        for p in ler_csv(arquivo_perguntas):
            if p["id"] in PERGUNTAS_IRRELEVANTES:
                continue
            if p["quem_perguntou"] not in ("lula", "flavio") or "Confronto direto" not in p["bloco"]:
                continue  # só o confronto direto entre os candidatos vai para a página (D-039, item 12); o CSV guarda todas
            if p["classificacao"] not in RESPOSTAS:
                erros.append(f"{p['id']}: classificação {p['classificacao']!r} fora do vocabulário")
            perguntas.append({"id": p["id"], "quem_perguntou": p["quem_perguntou"], "quem_respondeu": p["quem_respondeu"],
                              "bloco": p["bloco"], "pergunta": p["pergunta"].split(" | "), "objeto": p["objeto"],
                              "resposta": p["resposta"].split(" | "), "classificacao": p["classificacao"],
                              "justificativa": p["justificativa"], "desvio_antes": p.get("desvio_antes") == "sim"})
    # liga cada resposta à checagem do que o candidato afirmou nela, quando o trecho checado está na resposta
    for p in perguntas:
        texto = " ".join(p["resposta"])
        p["checagens"] = [{"id": i["id"], "selo": i["selo"], "afirmacao": i["afirmacao"]} for i in itens
                          if i["candidato"] == p["quem_respondeu"] and any(t[:60] in texto or texto[:60] in t for t in i["trechos"] if len(t) >= 20)]
    # análise retórica (D-042): manobras de confiança alta na página; indicadores e argumentação direta
    retorica = None
    pasta_ret = pasta / "retorica"
    if (pasta_ret / "manobras.csv").exists():
        manobras = ler_csv(pasta_ret / "manobras.csv")
        retorica = {
            "preliminar": not (pasta_ret / "REVISADO").exists(),  # D-042, item 4: sem a revisão do segundo agente, a página avisa
            "manobras": [{k: m[k] for k in ("id", "locutor", "bloco", "trecho", "estrategia_num", "estrategia_nome", "familia",
                                            "confianca", "efeito", "neutralizar")} for m in manobras if m["confianca"] == "alta"],
            "contagem": [{"locutor": m["locutor"], "familia": m["familia"], "confianca": m["confianca"],
                          "estrategia": f"{m['estrategia_num']}. {m['estrategia_nome']}"} for m in manobras],
            "legitimos": [{k: g[k] for k in ("id", "locutor", "bloco", "trecho", "tipo", "por_que")}
                          for g in ler_csv(pasta_ret / "legitimos.csv")] if (pasta_ret / "legitimos.csv").exists() else [],
            "indicadores": ler_csv(pasta_ret / "indicadores.csv") if (pasta_ret / "indicadores.csv").exists() else [],
        }
        catalogo = {}
        texto_cat = (RAIZ / "metodologia" / "retorica_estrategias.md").read_text(encoding="utf-8")
        for num, nome, corpo in re.findall(r"### (\d+)\. (.+?)\n(.*?)(?=\n### |\Z)", texto_cat, re.S):
            campo = lambda rotulo: (re.search(r"\*\*" + rotulo + r":\*\* (.+)", corpo) or [None, ""])[1].strip()
            catalogo[num] = {"nome": nome.strip(), "o_que_e": campo("O que é"), "falacia": campo("Falácia moderna").rstrip(".")}
        retorica["catalogo"] = catalogo
        for p in perguntas:  # liga a resposta às manobras de confiança alta que estão nela
            texto = " ".join(p["resposta"])
            p["manobras"] = [{"id": m["id"], "nome": m["estrategia_nome"]} for m in retorica["manobras"]
                             if m["locutor"] == p["quem_respondeu"] and (m["trecho"][:50] in texto or any(t[:50] in m["trecho"] for t in p["resposta"] if len(t) >= 25))]
    if erros:
        raise SystemExit("Erros na checagem do debate:\n  " + "\n  ".join(erros))
    # registros de falas públicas ligados a uma afirmação (eventos/debates/registros/<id>.csv; D-036, segundo complemento)
    for item in itens:
        arquivo_registro = pasta / "registros" / f"{item['id']}.csv"
        if arquivo_registro.exists():
            item["registro"] = [{"data": r["data"], "quem": r["quem"], "onde": r["onde"], "trecho": r["trecho"], "url": r["url"]}
                                for r in ler_csv(arquivo_registro)]
    itens.sort(key=lambda i: i["id"])  # ordem da transcrição
    sem_dados.sort(key=lambda i: i["id"])
    dados = {"tema": "debate", "gerado_em": HOJE.isoformat(), "debate": DEBATE, "itens": itens, "sem_dados": sem_dados, "perguntas": perguntas, "retorica": retorica}
    destino = RAIZ / "site" / "dados" / "debate.js"
    destino.write_text("window.DADOS = " + json.dumps(dados, ensure_ascii=False, separators=(",", ":")) + ";\n",
                       encoding="utf-8")
    print(f"{destino.relative_to(RAIZ)}: {len(itens) - len(sem_dados)} afirmações com selo, {len(sem_dados)} sem dados suficientes, "
          f"{destino.stat().st_size // 1024} KB")


if __name__ == "__main__":
    main()
