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

LAB = "/Users/oscar/.worktree/hot-reload/labs/hot-reload"
SRC = os.path.join(LAB, "api-common/src/lib.rs")
TLIB = subprocess.check_output(["rustc", "--print", "target-libdir"], text=True).strip()
BASE = dict(
    os.environ,
    RUSTC_WORKSPACE_WRAPPER="/Users/oscar/.worktree/hot-reload/target/debug/kan-hot-dev",
    KAN_HOT_WRAPPER_HOST="server",
    KAN_HOT_WRAPPER_HOT="api,api_common",
    KAN_HOT_RUNTIME_LIBS_FILE="/private/var/folders/ft/fkt3bwqd01g7f54wvyz9wgjc0000gn/T/opencode/link-exp/runtime.txt",
    KAN_HOT_TARGET_LIBDIR=TLIB,
)

variants = {
    "base": {},
    "nokache": {"CARGO_BUILD_RUSTC_WRAPPER": ""},
    "nokache_inc0": {"CARGO_BUILD_RUSTC_WRAPPER": "", "CARGO_INCREMENTAL": "0"},
    "nokache_offline": {"CARGO_BUILD_RUSTC_WRAPPER": "", "CARGO_NET_OFFLINE": "true"},
    "inc0": {"CARGO_INCREMENTAL": "0"},
    "offline": {"CARGO_NET_OFFLINE": "true"},
}

original = open(SRC).read()
results = {name: [] for name in variants}
order = list(itertools.product(range(5), variants))
for rep, name in order:
    marker = "nested-" + f"{rep * 6 + list(variants).index(name):02x}"  # 9 chars
    assert len(marker) == 9
    open(SRC, "w").write(original.replace("nested-v1", marker))
    env = dict(BASE)
    env.update(variants[name])
    start = time.monotonic()
    p = subprocess.run(
        ["cargo", "build", "--message-format=json-render-diagnostics", "-p", "api", "-p", "server", "--lib"],
        cwd=LAB, env=env, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
    )
    elapsed = (time.monotonic() - start) * 1000
    assert p.returncode == 0, name
    results[name].append(elapsed)
open(SRC, "w").write(original)

for name, values in results.items():
    print(f"{name:16} median={statistics.median(values):6.1f} mean={statistics.mean(values):6.1f} min={min(values):6.1f} max={max(values):6.1f}  {[round(v) for v in values]}")
