#!/usr/bin/env python3
import json, os, subprocess, time, statistics

LAB = "/Users/oscar/.worktree/hot-reload/labs/hot-reload"
SRC = os.path.join(LAB, "api-common/src/lib.rs")
REC = "/Users/oscar/.worktree/hot-reload/labs/hot-reload/target/kan-hot/debug/rustc"
original = open(SRC).read()

def load(name):
    d = json.load(open(os.path.join(REC, name + ".json")))
    return d["argv"], d["cwd"], d["env"]

api_argv, cwd, env = load("api")
ac_argv, _, _ = load("api_common")
print("api emit idx", [ (i,a) for i,a in enumerate(api_argv) if a in ("--emit","--emit=dep-info,metadata,link")])
print("ac emit idx", [ (i,a) for i,a in enumerate(ac_argv) if a in ("--emit","--emit=dep-info,metadata,link")])

def set_emit(argv, value):
    argv = list(argv)
    for i, a in enumerate(argv):
        if a == "--emit":
            argv[i + 1] = value
        elif a.startswith("--emit="):
            argv[i] = "--emit=" + value
    return argv

def strip_incremental(argv):
    out = []
    i = 0
    while i < len(argv):
        if argv[i] == "-C" and i + 1 < len(argv) and argv[i + 1].startswith("incremental="):
            i += 2
            continue
        if argv[i].startswith("-Cincremental="):
            i += 1
            continue
        out.append(argv[i]); i += 1
    return out

variants = {
    "baseline": (api_argv, ac_argv),
    "no_depinfo": (set_emit(api_argv, "metadata,link"), set_emit(ac_argv, "metadata,link")),
    "leaf_link_only": (set_emit(api_argv, "link"), set_emit(ac_argv, "metadata,link")),
    "leaf_link_only_noinc": (strip_incremental(set_emit(api_argv, "link")), strip_incremental(set_emit(ac_argv, "metadata,link"))),
    "noinc": (strip_incremental(api_argv), strip_incremental(ac_argv)),
}
results = {k: [] for k in variants}
for rep in range(6):
    for idx, (name, (a, b)) in enumerate(variants.items()):
        marker = "nested-" + f"{rep * len(variants) + idx:02x}"
        open(SRC, "w").write(original.replace("nested-v1", marker))
        start = time.monotonic()
        for argv in (b, a):
            r = subprocess.run(argv, cwd=cwd, env=dict(env), stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
            if r.returncode != 0:
                print(name, r.stderr.decode()[:1500]); raise SystemExit(1)
        results[name].append((time.monotonic() - start) * 1000)
open(SRC, "w").write(original)
for name, vals in results.items():
    print(f"{name:22} median={statistics.median(vals):6.1f} mean={statistics.mean(vals):6.1f} {[round(v) for v in vals]}")
