#!/usr/bin/env python3
import argparse
import json
from pathlib import Path

p = argparse.ArgumentParser(description="Render resolved static dependencies")
p.add_argument("graph")
p.add_argument("--entry", required=True)
p.add_argument("--output")
a = p.parse_args()
g = json.loads(Path(a.graph).read_text())
children = {}
for edge in g["edges"]:
    children.setdefault(edge["from"], []).append(edge)
for edges in children.values():
    edges.sort(key=lambda e: e.get("line", 0))
lines = [a.entry]
def walk(node, prefix, ancestors):
    edges = children.get(node, [])
    for i, edge in enumerate(edges):
        last = i == len(edges) - 1
        target = edge["to"]
        cycle = target in ancestors
        lines.append(prefix + ("└── " if last else "├── ") + target
                     + (" [cycle]" if cycle else ""))
        if not cycle:
            walk(target, prefix + ("    " if last else "│   "),
                 ancestors | {target})
if a.entry not in {n["id"] for n in g["nodes"]}:
    p.error("Entry is not present in graph")
walk(a.entry, "", {a.entry})
result = "\n".join(lines) + "\n"
if a.output:
    Path(a.output).write_text(result)
print(result, end="")
print("Resolved references only; unresolved count: "
      + str(len(g.get("unresolved", []))))
