import json, os, shutil, subprocess, time, glob
ROOT="/Users/oscar/.worktree/hot-reload/labs/hot-reload"; REC=f"{ROOT}/target/kan-hot/debug/rustc"
DEPS=f"{ROOT}/target/debug/deps"; SRC=f"{ROOT}/api-common/src/lib.rs"
BASE="/private/var/folders/ft/fkt3bwqd01g7f54wvyz9wgjc0000gn/T/opencode/pipe/out12"
def load(n): return json.load(open(f"{REC}/{n}.json"))
def strip_owned(argv):
    out=[]; i=1
    while i<len(argv):
        a=argv[i]
        if a=="-C" and i+1<len(argv) and any(argv[i+1].startswith(p) for p in ("incremental=","codegen-units=","debuginfo=")): i+=2; continue
        if a.startswith("-C") and any(a[2:].startswith(p) for p in ("incremental=","codegen-units=","debuginfo=")): i+=1; continue
        out.append(a); i+=1
    return out
common=load("api_common"); api=load("api"); orig=open(SRC).read()
shutil.rmtree(BASE,ignore_errors=True); os.makedirs(BASE)
def common_to(outdir,mark):
    open(SRC,"w").write(orig.replace("nested-v1",mark))
    ca=[common["argv"][0]]+strip_owned(common["argv"])+["-C","debuginfo=0","-C","codegen-units=1"]
    j=ca.index("--out-dir"); ca[j+1]=outdir
    subprocess.run(ca,cwd=common["cwd"],env=dict(common["env"]),stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)
    return os.path.join(outdir,[f for f in os.listdir(outdir) if f.startswith("libapi_common") and f.endswith(".rmeta")][0])
def api_cmd(outdir,inc,rmeta,emit=None):
    raw=[api["argv"][0]]+[a if not a.startswith("--extern=api_common=") else f"--extern=api_common={rmeta}" for a in api["argv"][1:]]
    aa=[api["argv"][0]]+strip_owned(raw)+["-C","debuginfo=0","-C","codegen-units=8","-C",f"incremental={inc}"]
    if emit:
        i=aa.index("--emit=dep-info,metadata,link"); aa[i]=f"--emit={emit}"
    j=aa.index("--out-dir"); aa[j+1]=outdir
    return aa
inc=f"{BASE}/inc"
def timed(outdir,mark,emit=None):
    rmeta=common_to(outdir,mark)
    s=time.monotonic(); p=subprocess.run(api_cmd(outdir,inc,rmeta,emit),cwd=api["cwd"],env=dict(api["env"]),stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL); return (time.monotonic()-s)*1000,p.returncode
try:
    # warm in deps
    for i in range(2): timed(DEPS,f"e12-w{i}"); time.sleep(.15)
    for label,clean,emit in [("deps-normal",False,None),("deps-clean-after",True,None),("deps-clean-before",True,None),("deps-link-only",False,"link")]:
        vals=[]
        for i in range(4):
            if clean:
                # delete only api outputs (not common)
                for pat in ["libapi-*","api-*.d"]:
                    for f in glob.glob(os.path.join(DEPS,pat)): os.remove(f)
                rmeta=common_to(DEPS,f"e12-{label}-{i}")
                s=time.monotonic(); p=subprocess.run(api_cmd(DEPS,inc,rmeta,emit),cwd=api["cwd"],env=dict(api["env"]),stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL); vals.append(((time.monotonic()-s)*1000,p.returncode))
            else:
                t,rc=timed(DEPS,f"e12-{label}-{i}",emit); vals.append((t,rc))
            time.sleep(.15)
        print(label, [f"{t:.1f}/{rc}" for t,rc in vals])
finally:
    open(SRC,"w").write(orig)
