"""Gera site/dados.js a partir de:
    indice.json + livros/**.md   (saída do processar_wiki.py — conteúdo original com imagens locais)
    scripts/assuntos.py          (organização por assunto)
    conteudo/<artigo>.md         (texto otimizado, opcional)

Uso:  python scripts/gerar_site.py
Depois: python -m http.server 8000  (na pasta base-sac)  e abra http://localhost:8000/site/
"""
import json
import os
import re
import sys
from pathlib import Path

BASE = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(Path(__file__).parent))
from assuntos import ASSUNTOS  # noqa: E402

SITE = BASE / "site"
CONTEUDO = BASE / "conteudo"
IMG_RE = re.compile(r"(!\[[^\]]*\]\()([^)\s]+)(\))")


def ler_indice():
    """Retorna páginas em ordem: {chave: info} e capítulos {livro/cap: [chaves]}."""
    idx = json.loads((BASE / "indice.json").read_text(encoding="utf-8"))
    paginas, capitulos = {}, {}
    for livro in idx["livros"]:
        lslug = livro["url"].rstrip("/").split("/")[-1]
        todas = capitulos.setdefault(f"{lslug}/*", [])
        for item in livro["itens"]:
            lista = item["paginas"] if "paginas" in item else [item]
            cap = item.get("capitulo")
            cslug = item["url"].rstrip("/").split("/")[-1] if cap else None
            for p in lista:
                chave = f"{lslug}/{p['url'].rstrip('/').split('/page/')[1]}"
                paginas[chave] = {**p, "livro": livro["nome"], "capitulo": cap}
                todas.append(chave)
                if cap:
                    capitulos.setdefault(f"{lslug}/{cslug}", []).append(chave)
    return paginas, capitulos


def md_original(info):
    arq = BASE / info["arquivo"]
    txt = arq.read_text(encoding="utf-8")
    txt = re.sub(r"^---\n.*?\n---\n", "", txt, count=1, flags=re.S).lstrip()
    txt = re.sub(r"^# .*\n", "", txt, count=1).strip()
    # diagramas draw.io vêm como <div drawio-diagram>![](img)</div>: markdown dentro de HTML não renderiza
    txt = re.sub(r"<div drawio-diagram[^>]*>\s*(!\[[^\]]*\]\([^)]*\))\s*</div>", r"\n\n\1\n\n", txt)

    # caminhos de imagem: relativos ao .md -> relativos a site/
    def conv(m):
        caminho = m.group(2)
        if caminho.startswith(("http", "data:")):
            return m.group(0)
        absoluto = (arq.parent / caminho).resolve()
        return m.group(1) + Path(os.path.relpath(absoluto, SITE)).as_posix() + m.group(3)
    return IMG_RE.sub(conv, txt)


def texto_busca(md):
    t = re.sub(r"!\[[^\]]*\]\([^)]*\)", " ", md)
    t = re.sub(r"<[^>]+>", " ", t)
    t = re.sub(r"[#*_>`|\[\]()-]+", " ", t)
    return re.sub(r"\s+", " ", t).strip()


def main():
    paginas, capitulos = ler_indice()
    usadas = set()
    saida = []
    avisos = []

    for assunto in ASSUNTOS:
        arts = []
        for art_id, titulo, fontes in assunto["artigos"]:
            chaves = []
            for fonte in fontes:
                if fonte.startswith("cap:"):
                    lista = capitulos.get(fonte[4:])
                    if not lista:
                        avisos.append(f"[{art_id}] capítulo não encontrado: {fonte}")
                        continue
                    chaves += lista
                elif fonte in paginas:
                    chaves.append(fonte)
                else:
                    avisos.append(f"[{art_id}] página não encontrada: {fonte}")
            chaves = list(dict.fromkeys(chaves))
            usadas.update(chaves)
            arts.append(montar_artigo(art_id, titulo, chaves, paginas))
        saida.append({"id": assunto["id"], "nome": assunto["nome"], "icone": assunto["icone"], "artigos": arts})

    sobras = [k for k in paginas if k not in usadas]
    if sobras:
        saida.append({"id": "outros", "nome": "Outros", "icone": "📁",
                      "artigos": [montar_artigo("outro-" + k.replace("/", "-"), paginas[k]["titulo"], [k], paginas) for k in sobras]})

    SITE.mkdir(exist_ok=True)
    js = "window.BASE_SAC = " + json.dumps({"assuntos": saida}, ensure_ascii=False) + ";\n"
    (SITE / "dados.js").write_text(js, encoding="utf-8")

    n_art = sum(len(a["artigos"]) for a in saida)
    n_rev = sum(1 for a in saida for x in a["artigos"] if x["otimizado"])
    print(f"Assuntos: {len(saida)}  Artigos: {n_art}  Otimizados: {n_rev}  Páginas usadas: {len(usadas)}/{len(paginas)}")
    for a in avisos:
        print("AVISO:", a)
    for s in sobras:
        print("SEM ASSUNTO:", s)


def montar_artigo(art_id, titulo, chaves, paginas):
    fontes = []
    for k in chaves:
        info = paginas[k]
        fontes.append({"titulo": info["titulo"], "livro": info["livro"], "capitulo": info["capitulo"],
                       "url": info["url"], "md": md_original(info)})
    otim = CONTEUDO / f"{art_id}.md"
    otimizado = None
    if otim.exists():
        otimizado = otim.read_text(encoding="utf-8").strip()
        otimizado = re.sub(r"^# .*\n", "", otimizado, count=1).strip()
        # imagens em conteudo/ podem apontar para ../livros/...; relativas a conteudo/ -> relativas a site/
        otimizado = IMG_RE.sub(lambda m: m.group(1) + (m.group(2) if m.group(2).startswith("http") else
                               Path(os.path.relpath((CONTEUDO / m.group(2)).resolve(), SITE)).as_posix()) + m.group(3), otimizado)
    busca = texto_busca(otimizado or " ".join(f["md"] for f in fontes))
    return {"id": art_id, "titulo": titulo, "otimizado": otimizado, "fontes": fontes, "busca": busca[:6000]}


if __name__ == "__main__":
    main()
