# -*- coding: utf-8 -*-
"""
Gera páginas HTML estáticas em site/sdr/ a partir dos SDRs em SDRs/sdr-*.md.

O corpo normativo aparece no HTML inicial (sem depender de fetch do .md), o que
facilita importação por URL em ferramentas como Notebook LM e crawlers simples.
Links: fonte .md em repositorio/SDRs/ (após sync) e visualizador ver-md.html.

Uso (na raiz do repositório):
  pip install -r arquitetura-contratual/scripts/requirements-gerar-html-sdr.txt
  python arquitetura-contratual/scripts/gerar_html_estatico_sdrs.py

Ordem sugerida com deploy: sync_site_repositorio.py → este script → gerar_site_search_index.py

SDR: sdr-0017-site-html-rastreabilidade
"""
from __future__ import annotations

import html
import re
import sys
from pathlib import Path
from urllib.parse import quote

try:
    import markdown
except ImportError:
    print(
        "Instale a dependência: pip install -r arquitetura-contratual/scripts/requirements-gerar-html-sdr.txt",
        file=sys.stderr,
    )
    sys.exit(1)

REPO = Path(__file__).resolve().parents[2]
SDRS_DIR = REPO / "SDRs"
SITE = REPO / "arquitetura-contratual" / "site"
OUT_DIR = SITE / "sdr"

# URL base do site publicado — usada no urls.txt para Notebook LM
SITE_BASE_URL = "https://centralservicos.web.app"

MD_EXTENSIONS = [
    "markdown.extensions.tables",
    "markdown.extensions.fenced_code",
    "markdown.extensions.nl2br",
    "markdown.extensions.sane_lists",
]

NAV_LINKS = [
    ("Início", "../index.html", "Página inicial"),
    ("Governança", "../governanca.html", "C1-GOV"),
    ("Operação", "../operacao.html", "C2-OPR"),
    ("Segurança", "../seguranca.html", "C3-SEC"),
    ("Planejamento", "../planejamento-contratacao.html", "Planejamento da contratação"),
    ("Aspectos comuns", "../aspectos-comuns.html", "Aspectos comuns"),
    ("Catálogo SDR (HTML)", "./index.html", "Lista de SDRs em HTML estático"),
    ("Visualizar MD", "../ver-md.html", "Leitor Markdown genérico"),
]


def nav_html() -> str:
    parts = [
        '<nav class="top-nav">',
    ]
    for label, href, title in NAV_LINKS:
        parts.append(
            f'    <a data-trilha="comum" href="{html.escape(href)}" title="{html.escape(title)}">{html.escape(label)}</a>'
        )
    parts.append(
        '  <div class="top-nav-search" role="search">'
        '    <label class="visually-hidden" for="site-search-q">Buscar no site</label>'
        '    <input type="search" id="site-search-q" class="site-search-input" placeholder="Buscar no site…" autocomplete="off" spellcheck="false" maxlength="120" aria-controls="site-search-results" />'
        '    <div id="site-search-results" class="site-search-results" hidden></div>'
        "  </div>"
        "</nav>"
    )
    return "\n".join(parts)


def first_heading_title(md_text: str, fallback: str) -> str:
    for line in md_text.splitlines()[:30]:
        s = line.strip()
        if s.startswith("# "):
            return s[2:].strip()
        if s.startswith("#\t"):
            return s[1:].strip()
    return fallback


def md_to_html_fragment(md_text: str) -> str:
    return markdown.markdown(
        md_text,
        extensions=MD_EXTENSIONS,
        output_format="html5",
    )


def rewrite_static_sdr_links(html_fragment: str) -> str:
    """
    No Markdown, links são relativos à pasta SDRs/ (ex.: ../.cursor/, ./governance/).
    Em site/sdr/*.html isso vira URLs quebradas no Hosting (ex.: /.cursor/..., /sdr/governance/...).
    Reescreve para caminhos válidos sob site/ (espelho repositorio/ e ver-md).
    """
    out = html_fragment
    # Cópia espelhada das regras de governança (equivalente ao .mdc no Cursor)
    out = re.sub(
        r'href="\./governance/rules/([^"]+)"',
        r'href="../repositorio/SDRs/governance/rules/\1"',
        out,
    )
    out = out.replace(
        'href="./governance/README.md"',
        'href="../repositorio/SDRs/governance/README.md"',
    )
    out = out.replace('href="./traceability.md"', 'href="../repositorio/SDRs/traceability.md"')
    gov_mdc = {
        "sdr-conformity-checker.mdc": "../repositorio/SDRs/governance/rules/sdr-conformity-checker.md",
        "implementation-without-sdr-detector.mdc": "../repositorio/SDRs/governance/rules/implementation-without-sdr-detector.md",
        "no-vibecoding-without-sdr.mdc": "../repositorio/SDRs/governance/rules/no-vibecoding-without-sdr.md",
        "portugues-brasil-respostas.mdc": "../repositorio/SDRs/governance/rules/portugues-brasil-respostas.md",
    }
    for mdc, target in gov_mdc.items():
        out = out.replace(f'href="../.cursor/rules/{mdc}"', f'href="{target}"')
        out = out.replace(f'href="../../.cursor/rules/{mdc}"', f'href="{target}"')
    # Demais .cursor: conteúdo normativo ligado a SDRs espelhados (sem publicar .mdc no Hosting)
    cursor_rules = {
        "inicio-sessao-agente.mdc": "../ver-md.html?f=repositorio/SDRs/sdr-0021-planejamento-pre-alteracao-agente.md",
        "sdr-edicao-exclusiva-fonte-verdade.mdc": "./sdr-0025-propagacao-sdr-consumidores-site-contratacao.html",
    }
    for mdc, target in cursor_rules.items():
        out = out.replace(f'href="../.cursor/rules/{mdc}"', f'href="{target}"')
        out = out.replace(f'href="../../.cursor/rules/{mdc}"', f'href="{target}"')
    cursor_cmds = {
        "inicio-sessao.md": "../ver-md.html?f=repositorio/SDRs/sdr-0021-planejamento-pre-alteracao-agente.md",
        "alterar-sdr.md": "../ver-md.html?f=repositorio/SDRs/sdr-0025-propagacao-sdr-consumidores-site-contratacao.md",
    }
    for cmd, target in cursor_cmds.items():
        out = out.replace(f'href="../.cursor/commands/{cmd}"', f'href="{target}"')
        out = out.replace(f'href="../../.cursor/commands/{cmd}"', f'href="{target}"')
    out = out.replace('href="../AGENTS.md"', 'href="../ver-md.html?f=repositorio/AGENTS.md"')
    out = out.replace('href="../../AGENTS.md"', 'href="../ver-md.html?f=repositorio/AGENTS.md"')

    # --- Workspace (caminhos relativos a SDRs/) → Hosting (site/ e repositorio/) ---
    # Dois níveis: sobe acima de site/sdr/ (errado no deploy); um nível: ../ = raiz do site.
    out = out.replace(
        'href="../../arquitetura-contratual/site/"',
        'href="../index.html"',
    )
    out = out.replace(
        'href="../arquitetura-contratual/site/"',
        'href="../index.html"',
    )
    out = re.sub(
        r'href="\.\./\.\./arquitetura-contratual/site/([^"]+)"',
        r'href="../\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./arquitetura-contratual/site/([^"]+)"',
        r'href="../\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./\.\./arquitetura-contratual/(modelo-central-servicos\.html[^"]*)"',
        r'href="../\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./\.\./arquitetura-contratual/([^"]+)"',
        r'href="../repositorio/arquitetura-contratual/\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./\.\./Dados-ibama/([^"]*)"',
        r'href="../repositorio/Dados-ibama/\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./Dados-ibama/([^"]*)"',
        r'href="../repositorio/Dados-ibama/\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./Informacoes-gerais/([^"]*)"',
        r'href="../repositorio/Informacoes-gerais/\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./processo-contratacao/([^"]*)"',
        r'href="../repositorio/processo-contratacao/\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./docs/([^"]*)"',
        r'href="../repositorio/docs/\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./scripts/([^"]*)"',
        r'href="../repositorio/scripts/\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./arquitetura-contratual/scripts/([^"]*)"',
        r'href="../repositorio/arquitetura-contratual/scripts/\1"',
        out,
    )
    out = re.sub(
        r'href="\.\./arquitetura-contratual/([^"]+)"',
        r'href="../repositorio/arquitetura-contratual/\1"',
        out,
    )

    # Cross-links entre SDRs: na pasta site/sdr/ o .md não existe; usar HTML estático irmão (com ou sem #âncora).
    out = re.sub(
        r'href="\./(sdr-[^"/]+\.md)(#[^"]*)?"',
        lambda m: f'href="./{m.group(1)[:-3]}.html{m.group(2) or ""}"',
        out,
    )
    out = re.sub(
        r'href="\./(templates/[^"]+\.md)"',
        r'href="../ver-md.html?f=repositorio/SDRs/\1"',
        out,
    )
    out = out.replace(
        'href="./REGRAS-AGENTE-E-PROMPTS.md"',
        'href="../repositorio/SDRs/REGRAS-AGENTE-E-PROMPTS.md"',
    )
    out = out.replace(
        'href="./glossario-eixos.md"',
        'href="../repositorio/SDRs/glossario-eixos.md"',
    )
    out = out.replace(
        'href="../modelo-servicos-ti/"',
        'href="../repositorio/modelo-servicos-ti/README.md"',
    )
    out = out.replace(
        'href="../.gitignore"',
        'href="../ver-md.html?f=repositorio/referencia-gitignore.md"',
    )
    return out


def page_template(
    *,
    title: str,
    hero_sub: str,
    inner_html: str,
    md_rel_repo: str,
    md_basename: str,
) -> str:
    title_esc = html.escape(title)
    sub_esc = html.escape(hero_sub, quote=True)
    q = quote(md_basename, safe="")
    ver_md_href = f"../ver-md.html?f=repositorio/SDRs/{q}"
    dl_href = f"../repositorio/SDRs/{q}"

    return f"""<!DOCTYPE html>
<html lang="pt-BR">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="{sub_esc} — texto completo no HTML (importação por URL / Notebook LM).">
  <script src="../assets/js/access-gate.js"></script>
  <title>{title_esc} — Central de Serviços de TI</title>
  <link rel="stylesheet" href="../assets/css/base.css">
  <style>
    .sdr-static-page .sdr-static-prose {{ line-height: 1.7; max-width: 100%; }}
    .sdr-static-page h1 {{ font-size: 1.5rem; margin: 1.25em 0 0.5em; color: #0f172a; }}
    .sdr-static-page h2 {{ font-size: 1.25rem; margin: 1.2em 0 0.5em; color: #1e293b; }}
    .sdr-static-page h3 {{ font-size: 1.1rem; margin: 1em 0 0.4em; }}
    .sdr-static-page p, .sdr-static-page li {{ margin: 0.6em 0; }}
    .sdr-static-page ul, .sdr-static-page ol {{ padding-left: 1.35rem; }}
    .sdr-static-page table {{ width: 100%; border-collapse: collapse; font-size: 13px; margin: 1em 0; }}
    .sdr-static-page th, .sdr-static-page td {{ border: 1px solid var(--border); padding: 8px 10px; text-align: left; }}
    .sdr-static-page th {{ background: #f1f5f9; }}
    .sdr-static-page pre, .sdr-static-page code {{ background: #f1f5f9; border-radius: 6px; }}
    .sdr-static-page pre {{ padding: 12px; overflow: auto; }}
    .sdr-static-page code {{ padding: 2px 6px; font-size: 0.9em; }}
    .sdr-static-page pre code {{ background: none; padding: 0; }}
    .sdr-static-links {{ font-size: 0.95rem; margin-top: 12px; }}
  </style>
</head>
<body data-trilha="comum">
{nav_html()}
  <header class="hero">
    <h1>{title_esc}</h1>
    <p>Página <strong>estática</strong> gerada a partir do Markdown do repositório — o texto abaixo já vem no HTML (adequado a importação por URL em ferramentas que não executam o <code>ver-md.html</code>). {html.escape(hero_sub)}</p>
    <p class="sdr-static-links">
      <a href="{dl_href}" download>Baixar o .md</a> —
      <a href="{ver_md_href}">Abrir no visualizador Markdown</a> —
      <a href="./index.html">Catálogo de SDRs</a> —
      <a href="../index.html">Início do site</a>
    </p>
  </header>
  <main class="layout">
    <aside class="side-nav">
      <h3>Nesta página</h3>
      <a href="#sdr-conteudo">Início do documento</a>
    </aside>
    <div class="content">
      <section id="sdr-conteudo" class="sdr-static-page" aria-label="SDR renderizado">
        <p class="links"><strong>Fonte:</strong> <code>{html.escape(md_rel_repo)}</code></p>
        <div class="sdr-static-prose">
{inner_html}
        </div>
      </section>
    </div>
  </main>
  <footer>
    <div>Central de Serviços de TI</div>
    <div class="footer-meta">Última atualização: 26 de abril de 2026 · Deploy (America/São Paulo): <span id="footer-deploy-at">—</span> · Autor: Elias Cotrim</div>
  </footer>
  <script src="../assets/js/site-search-index.js"></script>
  <script src="../assets/js/site-search.js" defer></script>
  <script src="../assets/js/nav.js" defer></script>
  <script src="../assets/js/siglas.js" defer></script>
  <script src="../assets/js/footer-deploy.js" defer></script>
</body>
</html>
"""


def index_template(rows: list[tuple[str, str, str]]) -> str:
    """rows: (display_title, html_filename, md_basename)"""
    body_rows = []
    for display, html_fn, md_base in rows:
        body_rows.append(
            "<tr>"
            f'<td><a href="./{html.escape(html_fn)}">{html.escape(display)}</a></td>'
            f'<td><a href="../repositorio/SDRs/{quote(md_base, safe="")}" download>{html.escape(md_base)}</a></td>'
            f'<td><a href="../ver-md.html?f=repositorio/SDRs/{quote(md_base, safe="")}">ver-md</a></td>'
            "</tr>"
        )
    table = "\n".join(body_rows)
    return f"""<!DOCTYPE html>
<html lang="pt-BR">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="../assets/js/access-gate.js"></script>
  <title>Catálogo SDR (HTML estático) — Central de Serviços de TI</title>
  <link rel="stylesheet" href="../assets/css/base.css">
</head>
<body data-trilha="comum">
{nav_html()}
  <header class="hero">
    <h1>Catálogo SDR (HTML estático)</h1>
    <p>Uma página HTML por arquivo <code>sdr-*.md</code>, com <strong>conteúdo completo no primeiro carregamento</strong> (sem depender de JavaScript para buscar o Markdown). Útil para <strong>Notebook LM</strong> e crawlers. A norma canônica continua no Git em <code>SDRs/</code>; o espelho <code>repositorio/SDRs/</code> é gerado pelo <code>sync_site_repositorio.py</code>.</p>
    <p class="links"><a href="../planejamento-contratacao.html">Planejamento da contratação</a> — guia Notebook LM no repositório: <code>docs/notebook-lm-fontes.md</code></p>
  </header>
  <main class="layout">
    <div class="content">
      <section id="catalogo">
        <h2>Documentos</h2>
        <table class="table">
          <tr><th>Título / link HTML</th><th>Markdown (download)</th><th>Leitor</th></tr>
{table}
        </table>
      </section>
    </div>
  </main>
  <footer>
    <div>Central de Serviços de TI</div>
    <div class="footer-meta">Deploy (America/São Paulo): <span id="footer-deploy-at">—</span></div>
  </footer>
  <script src="../assets/js/site-search-index.js"></script>
  <script src="../assets/js/site-search.js" defer></script>
  <script src="../assets/js/nav.js" defer></script>
  <script src="../assets/js/siglas.js" defer></script>
  <script src="../assets/js/footer-deploy.js" defer></script>
</body>
</html>
"""


def main() -> None:
    if not SDRS_DIR.is_dir():
        print(f"Erro: pasta não encontrada: {SDRS_DIR}", file=sys.stderr)
        sys.exit(1)

    files = sorted(SDRS_DIR.glob("sdr-*.md"))
    if len(files) < 5:
        print("Erro: poucos SDRs encontrados.", file=sys.stderr)
        sys.exit(1)

    OUT_DIR.mkdir(parents=True, exist_ok=True)

    catalog: list[tuple[str, str, str]] = []

    for md_path in files:
        md_text = md_path.read_text(encoding="utf-8")
        base = md_path.name
        html_name = base[:-3] + ".html" if base.lower().endswith(".md") else base + ".html"
        title = first_heading_title(md_text, base)
        fragment = rewrite_static_sdr_links(md_to_html_fragment(md_text))
        # Não indentar o fragmento: preserva <pre>/<code> e literais.

        page = page_template(
            title=title,
            hero_sub=f"Arquivo: {base}",
            inner_html=fragment,
            md_rel_repo=f"SDRs/{base}",
            md_basename=base,
        )
        out_path = OUT_DIR / html_name
        out_path.write_text(page, encoding="utf-8")
        catalog.append((title, html_name, base))

    idx = index_template(catalog)
    (OUT_DIR / "index.html").write_text(idx, encoding="utf-8")

    print(f"OK: {OUT_DIR} — {len(files)} páginas SDR + index.html")


if __name__ == "__main__":
    main()
