#!/usr/bin/env python3
"""Extract endpoint count summaries from OpenAPI specs for the changelog."""
import json
import sys
from collections import defaultdict
from pathlib import Path


def summarize(spec_path):
    spec = json.loads(Path(spec_path).read_text())
    paths = spec.get("paths", {})
    by_tag = defaultdict(list)
    method_counts = defaultdict(int)
    total_ops = 0
    for url, methods in paths.items():
        for method, op in methods.items():
            if method not in {"get", "post", "put", "delete", "patch", "options", "head"}:
                continue
            total_ops += 1
            method_counts[method.upper()] += 1
            tags = op.get("tags") or ["_untagged"]
            for tag in tags:
                by_tag[tag].append(f"{method.upper()} {url}")
    return {
        "title": spec.get("info", {}).get("title"),
        "version": spec.get("info", {}).get("version"),
        "openapi": spec.get("openapi"),
        "path_count": len(paths),
        "operation_count": total_ops,
        "method_counts": dict(method_counts),
        "by_tag": {tag: ops for tag, ops in sorted(by_tag.items(), key=lambda kv: (-len(kv[1]), kv[0]))},
    }


def render_markdown(summary):
    lines = []
    lines.append(f"- Total paths: **{summary['path_count']}**")
    lines.append(f"- Total operations: **{summary['operation_count']}**")
    method_str = ", ".join(f"{m}={c}" for m, c in sorted(summary["method_counts"].items()))
    lines.append(f"- Methods: {method_str}")
    lines.append("")
    lines.append("| Tag | Operation count |")
    lines.append("|-----|----------------:|")
    for tag, ops in summary["by_tag"].items():
        lines.append(f"| `{tag}` | {len(ops)} |")
    return "\n".join(lines)


if __name__ == "__main__":
    for path in sys.argv[1:]:
        s = summarize(path)
        print(f"# {s['title']} v{s['version']} ({path})")
        print(render_markdown(s))
        print()
