"""Normalize markdown escapes before Pandoc conversion.

Reads:  argv[1] (input .md) or revised.md by default
Writes: argv[2] (output .md) or preprocessed.md by default
Uses:   scripts/refs_resolved.json to map [N] citations to [@bibkeyN]
"""
import json
import re
import sys
from pathlib import Path

ROOT = Path(__file__).parent.parent
REFS_RESOLVED = ROOT / "scripts" / "refs_resolved.json"


def build_key_map() -> dict[int, str]:
    if not REFS_RESOLVED.exists():
        print(f"WARNING: {REFS_RESOLVED} not found — citations will be left as [N]")
        return {}
    data = json.loads(REFS_RESOLVED.read_text(encoding="utf-8"))
    return {r["num"]: r.get("bib_key", f"ref{r['num']:02d}") for r in data}


def preprocess(text: str, key_map: dict[int, str]) -> str:
    # Remove backslash escapes from brackets
    text = re.sub(r"\\\[", "[", text)
    text = re.sub(r"\\\]", "]", text)
    # Convert citations [N] -> [@bibkey]
    def cite_repl(m: re.Match) -> str:
        num = int(m.group(1))
        key = key_map.get(num)
        return f"[@{key}]" if key else m.group(0)
    text = re.sub(r"\[(\d+)\]", cite_repl, text)
    # Strip empty heading markers "## " alone on a line
    text = re.sub(r"^#{1,6}\s*$", "", text, flags=re.MULTILINE)
    # Collapse multiple blank lines
    text = re.sub(r"\n{3,}", "\n\n", text)
    return text


def main() -> None:
    src = Path(sys.argv[1]) if len(sys.argv) > 1 else ROOT / "revised.md"
    dst = Path(sys.argv[2]) if len(sys.argv) > 2 else ROOT / "preprocessed.md"
    text = src.read_text(encoding="utf-8")
    key_map = build_key_map()
    out = preprocess(text, key_map)
    dst.write_text(out, encoding="utf-8")

    pre_n = len(re.findall(r"\\?\[\d+\\?\]", text))
    post_n = len(re.findall(r"\[@[a-z0-9]+\]", out))
    print(f"{src} -> {dst}")
    print(f"Citations before: {pre_n}  after: {post_n}")


if __name__ == "__main__":
    main()
