import json,io,glob,os,re,sys
O=".spt/preserved/deployah-294-armA-20260910"
rows=[]
for log in sorted(glob.glob(f"{O}/run-*.log")):
    run=re.search(r"run-(\d+)\.log$",log.replace("\\","/")).group(1)
    evs=[]
    for line in io.open(log,encoding="utf-8",errors="replace"):
        i=line.find("IR294 ")
        if i!=-1:
            try: evs.append(json.loads(line[i+6:]))
            except Exception: pass
    with io.open(f"{O}/run-{run}.events.jsonl","w",encoding="utf-8",newline="") as f:
        for e in evs: f.write(json.dumps(e)+"\n")
    txt=io.open(log,encoding="utf-8",errors="replace").read()
    m=re.search(r"Summary \[\s*([\d.]+)s\] (\d+) tests? run: (\d+) passed",txt)
    cell=re.search(r"(PASS|FAIL)\s+\[\s*([\d.]+)s\]",txt)
    polls=[e for e in evs if e["stage"]=="poll.success"]
    exp=[e for e in evs if e["stage"]=="poll.expiry"]
    span=(max(e["elapsed_us"] for e in evs)-min(e["elapsed_us"] for e in evs))/1e6 if evs else None
    first=next((e for e in evs if e["stage"]=="pull.identity"),None)
    rows.append({
        "run":run,"outcome":cell.group(1) if cell else None,
        "cell_s":float(cell.group(2)) if cell else None,
        "summary_s":float(m.group(1)) if m else None,
        "summary_count":txt.count("     Summary ["),
        "events":len(evs),"span_s":span,
        "setup_gap_s":(first["elapsed_us"]/1e6 if first else None),
        "polls":[{"exchange":p["fields"]["exchange"],"iterations":p["fields"]["iterations"],
                  "poll_s":p["fields"]["poll_elapsed_us"]/1e6,"ipc_s":p["fields"]["ipc_us"]/1e6}
                 for p in polls],
        "expiries":len(exp),
    })
io.open(f"{O}/ARM-A-SUMMARY.json","w",encoding="utf-8",newline="").write(json.dumps(rows,indent=2))
print(f"{'run':>4} {'out':>4} {'cell_s':>8} {'span_s':>8} {'setup_s':>8} {'p1_it':>6} {'p1_s':>7} {'p2_it':>6} {'p3_it':>6} {'exp':>3}")
for r in rows:
    p=r["polls"]; g=lambda i,k: (p[i][k] if len(p)>i else None)
    print(f"{r['run']:>4} {str(r['outcome']):>4} {r['cell_s']:>8.3f} {r['span_s'] or 0:>8.3f} {r['setup_gap_s'] or 0:>8.3f} "
          f"{str(g(0,'iterations')):>6} {g(0,'poll_s') or 0:>7.3f} {str(g(1,'iterations')):>6} {str(g(2,'iterations')):>6} {r['expiries']:>3}")
if len(rows)>1:
    import statistics as st
    for k,f in (("cell_s",lambda r:r["cell_s"]),("first-poll iters",lambda r:r["polls"][0]["iterations"] if r["polls"] else None),
                ("first-poll s",lambda r:r["polls"][0]["poll_s"] if r["polls"] else None),("setup_gap_s",lambda r:r["setup_gap_s"])):
        v=[f(r) for r in rows if f(r) is not None]
        if v: print(f"{k:>18}: n={len(v)} min={min(v):.3f} med={st.median(v):.3f} max={max(v):.3f}")
