"""cloud_start.py ON N LABEL [extra create args...]

Released `cua` CLI only. For i in 0..N-1, serially:
  t0 -> `cua sb create linux --on ON --name cb-LABEL-i --json [extra, e.g. --headless]` returns
  -> `cua sb exec cb-LABEL-i -- echo ok` returns "ok"  (= first exec)
  then `cua sb rm cb-LABEL-i --force` (not timed).
Prints one JSON line per sample and a summary line. Needs CUA_HOME etc. in env
and `cua` on PATH.
"""
import json
import subprocess
import sys
import time

ON, N, LABEL = sys.argv[1], int(sys.argv[2]), sys.argv[3]
EXTRA = sys.argv[4:]


def run(args, timeout):
    t = time.perf_counter()
    p = subprocess.run(args, capture_output=True, text=True, timeout=timeout)
    return p, (time.perf_counter() - t) * 1000


res = []
for i in range(N):
    name = f"cb-{LABEL}-{i}"
    row = {"i": i, "name": name, "on": ON, "at": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())}
    t0 = time.perf_counter()
    try:
        p, cms = run(["cua", "sb", "create", "linux", "--on", ON, "--name", name, "--json", *EXTRA], 1500)
        row["create_ms"] = round(cms, 1)
        row["create_rc"] = p.returncode
        if p.returncode != 0:
            row["ok"] = False
            row["error"] = (p.stderr or p.stdout)[-600:]
        else:
            q, ems = run(["cua", "sb", "exec", name, "--", "echo", "ok"], 300)
            row["exec_ms"] = round(ems, 1)
            row["first_exec_ms"] = round((time.perf_counter() - t0) * 1000, 1)
            row["ok"] = q.returncode == 0 and "ok" in q.stdout
            if not row["ok"]:
                row["error"] = (q.stderr or q.stdout)[-600:]
            try:
                row["create_json"] = json.loads(p.stdout.strip().splitlines()[-1])
            except Exception:
                row["create_stdout"] = p.stdout[-400:]
    except subprocess.TimeoutExpired as e:
        row["ok"] = False
        row["error"] = f"timeout {e.timeout}s"
    d, dms = run(["cua", "sb", "rm", name, "--force"], 600)
    row["delete_rc"] = d.returncode
    row["delete_ms"] = round(dms, 1)
    res.append(row)
    print(json.dumps(row), flush=True)

ok = sorted(r["first_exec_ms"] for r in res if r.get("ok"))
print(json.dumps({"summary": True, "on": ON, "label": LABEL, "n": N, "ok": len(ok),
                  "first_exec_p50": ok[len(ok) // 2] if ok else None}), flush=True)
