#!/usr/bin/env python3
"""Submit a cloned H3 workflow JSON to ComfyUI and wait for completion.
Usage: submit_run.py <graph.json> <tag>
Prints JSON line at end: {"tag":..., "prompt_id":..., "status":..., "render_sec":...}
"""
import json, sys, time, urllib.request

def post(url, obj, timeout=30):
    req = urllib.request.Request(url, data=json.dumps(obj).encode(),
                                 headers={"Content-Type": "application/json"})
    return json.load(urllib.request.urlopen(req, timeout=timeout))

def main():
    gf, tag = sys.argv[1], sys.argv[2]
    payload = json.load(open(gf))["graph"]
    r = post("http://127.0.0.1:8188/prompt", {"prompt": payload})
    if r.get("node_errors"):
        print("NODE_ERRORS:", json.dumps(r["node_errors"])[:2000]); sys.exit(2)
    pid = r["prompt_id"]
    print(f"[{tag}] submitted prompt_id={pid}", flush=True)
    t0 = time.time()
    while True:
        time.sleep(20)
        h = json.load(urllib.request.urlopen(f"http://127.0.0.1:8188/history/{pid}", timeout=15))
        if pid in h:
            e = h[pid]
            st = e.get("status", {})
            outs = []
            for nid, o in e.get("outputs", {}).items():
                for im in o.get("images", []) or []:
                    outs.append(im.get("filename"))
            dur = round(time.time() - t0)
            print(json.dumps({"tag": tag, "prompt_id": pid,
                              "status": st.get("status_str"),
                              "render_sec_wallclock": dur,
                              "outputs": outs}, ensure_ascii=False), flush=True)
            sys.exit(0 if st.get("status_str") == "success" else 4)
        if time.time() - t0 > 3600:
            print(json.dumps({"tag": tag, "prompt_id": pid, "status": "wait_timeout"})); sys.exit(5)

if __name__ == "__main__":
    main()
