#!/usr/bin/env python3
"""
KAR-69 A: convert NotebookLM mindmap.json to Mermaid mindmap → PNG.

Usage: aria-mindmap-to-png.py <mindmap.json> [output.png]
Default output: <same-dir>/mindmap.png
"""
import json
import re
import subprocess
import sys
from pathlib import Path

MMDC = "/root/aria/mcps/mermaid/node_modules/.bin/mmdc"
PUPPETEER_CFG = "/root/aria/mcps/mermaid/puppeteer-config.json"


def sanitize(label: str) -> str:
    """Mermaid mindmap nodes choke on (, ), [, ], parens, quotes. Strip and clean."""
    label = label.strip()
    label = re.sub(r"[()\[\]<>]", "", label)
    label = re.sub(r'["`]', "", label)
    # Mermaid treats lines with newlines as new nodes; collapse to space.
    label = " ".join(label.split())
    # Trim long labels for readability in render
    if len(label) > 60:
        label = label[:57] + "..."
    return label or "?"


def to_mermaid(node: dict, depth: int = 0, is_root: bool = True) -> list[str]:
    lines: list[str] = []
    name = sanitize(node.get("name", "?"))
    indent = "  " * (depth + 1)
    if is_root:
        lines.append(f"{indent}root(({name}))")
    else:
        lines.append(f"{indent}{name}")
    for child in node.get("children", []) or []:
        lines.extend(to_mermaid(child, depth + 1, is_root=False))
    return lines


def main():
    if len(sys.argv) < 2:
        print(f"Usage: {sys.argv[0]} <mindmap.json> [output.png]", file=sys.stderr)
        sys.exit(1)

    src = Path(sys.argv[1]).resolve()
    if not src.exists():
        print(f"Not found: {src}", file=sys.stderr)
        sys.exit(2)

    out = Path(sys.argv[2]).resolve() if len(sys.argv) > 2 else src.with_suffix(".png")

    data = json.loads(src.read_text(encoding="utf-8"))
    mermaid_lines = ["mindmap", *to_mermaid(data)]
    mermaid_text = "\n".join(mermaid_lines) + "\n"

    mmd_path = src.with_suffix(".mmd")
    mmd_path.write_text(mermaid_text, encoding="utf-8")

    cmd = [
        MMDC,
        "-p", PUPPETEER_CFG,
        "-i", str(mmd_path),
        "-o", str(out),
        "-b", "white",
        "-w", "1600",
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        print(f"mmdc failed (exit {result.returncode}):", file=sys.stderr)
        print(result.stderr, file=sys.stderr)
        sys.exit(3)

    if not out.exists():
        print(f"output not created: {out}", file=sys.stderr)
        sys.exit(4)

    print(out)


if __name__ == "__main__":
    main()
