#!/usr/bin/env python3
"""Fill panel-template.html with live pql data → widget_code for show_widget.

Emits the interactive in-chat pql panel (see ../SKILL.md §Interactive panel):
WIP + unblocked leaf work of the active phase, capped, with one-click
Pick up ↗ / Detail ↗ sendPrompt actions. Claude runs this and pastes stdout
verbatim as the show_widget widget_code.

Usage:  .claude/skills/pql-board/support/make-panel [--phase T-NNN] [--cap N]
        (defaults: active phase T-750, cap 10; output on stdout)
"""

import argparse
import json
import subprocess
from pathlib import Path

ARTIFACT_URL = "https://claude.ai/code/artifact/0064e59d-84a9-4a31-a830-f7d677df9d92"
FIELDS = "id,type,priority,status,title,updated_at"
PRIORITY_RANK = {"critical": 0, "high": 1, "medium": 2, "low": 3}
STATUS_RANK = {"in_progress": 0, "review": 1, "ready": 2, "backlog": 3}
ACTIONABLE_TYPES = ("story", "task", "bug")
MAINTENANCE = "T-1037"


def pql(*args):
    out = subprocess.run(
        ["pql", *args], capture_output=True, text=True, check=True
    ).stdout
    return json.loads(out)


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--phase", default="T-750")
    ap.add_argument("--cap", type=int, default=10)
    args = ap.parse_args()

    wip = pql("ticket", "list", "--status", "in_progress", "--fields", FIELDS)
    phase = pql(
        "ticket", "list", "--under", args.phase, "--unblocked", "--leaf",
        "--fields", FIELDS,
    )
    maint = pql(
        "ticket", "list", "--under", MAINTENANCE, "--unblocked", "--leaf",
        "--fields", FIELDS,
    )

    seen, rows = set(), []
    for t in wip + phase + maint:
        if t["id"] in seen or t["type"] not in ACTIONABLE_TYPES:
            continue
        if t["status"] in ("done", "cancelled"):
            continue
        seen.add(t["id"])
        rows.append(t)

    rows.sort(key=lambda t: t.get("updated_at") or "", reverse=True)
    rows.sort(
        key=lambda t: (
            STATUS_RANK.get(t["status"], 3),
            PRIORITY_RANK.get(t.get("priority"), 2),
        )
    )
    overflow = max(0, len(rows) - args.cap)
    rows = rows[: args.cap]

    tpl = (Path(__file__).parent / "panel-template.html").read_text()
    data = json.dumps(
        {"rows": rows, "url": ARTIFACT_URL, "overflow": overflow},
        ensure_ascii=False,
        separators=(",", ":"),
    ).replace("</", "<\\/")
    print(tpl.replace("__URL__", ARTIFACT_URL).replace("__DATA__", data))


if __name__ == "__main__":
    main()
