import json, os, shutil, subprocess, time

ROOT="/Users/oscar/.worktree/hot-reload/labs/hot-reload"
REC=f"{ROOT}/target/kan-hot/debug/rustc"
SCRATCH="/private/var/folders/ft/fkt3bwqd01g7f54wvyz9wgjc0000gn/T/opencode/pipe/out3"
SRC=f"{ROOT}/api-common/src/lib.rs"
def load(n): return json.load(open(f"{REC}/{n}.json"))
def env_of(d):
    e=dict(d["env"]); e["PATH"]=os.environ["PATH"]; return e
common=load("api_common"); api=load("api")
shutil.rmtree(SCRATCH,ignore_errors=True); os.makedirs(SCRATCH)
original=open(SRC).read()
inc=f"{SCRATCH}/inc_api"; shutil.rmtree(inc,ignore_errors=True)
def api_argv(rmeta):
    out=[]; j=0
    while j<len(api["argv"]):
        a=api["argv"][j]
        if a.startswith("--extern=api_common="): out.append(f"--extern=api_common={rmeta}")
        elif a=="-C" and j+1<len(api["argv"]) and api["argv"][j+1].startswith("incremental="):
            out+=["-C",f"incremental={inc}"]; j+=1
        else: out.append(a)
        j+=1
    i=out.index("--out-dir"); out[i+1]=SCRATCH
    return out
try:
    for i in range(5):
        open(SRC,"w").write(original.replace("nested-v1",f"exp3-{i}"))
        # clean outputs from prior iteration
        for f in os.listdir(SCRATCH):
            if f.endswith(".rmeta"): os.remove(os.path.join(SCRATCH,f))
        argv=list(common["argv"]); j=argv.index("--out-dir"); argv[j+1]=SCRATCH
        t0=time.monotonic()
        p=subprocess.Popen(argv,cwd=common["cwd"],env=env_of(common),stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)
        rmeta=None; t_meta=None
        while p.poll() is None:
            files=[f for f in os.listdir(SCRATCH) if f.endswith(".rmeta")]
            if files:
                try:
                    sz=os.path.getsize(os.path.join(SCRATCH,files[0]))
                except OSError: sz=0
                if sz>0:
                    rmeta=os.path.join(SCRATCH,files[0]); t_meta=(time.monotonic()-t0)*1000; break
            time.sleep(0.0001)
        p.wait(); t_full=(time.monotonic()-t0)*1000
        if rmeta is None:
            files=[f for f in os.listdir(SCRATCH) if f.endswith(".rmeta")]
            rmeta=os.path.join(SCRATCH,files[0]) if files else None
        ts=time.monotonic(); pa=subprocess.run(api_argv(rmeta),cwd=api["cwd"],env=env_of(api),capture_output=True,text=True); t_api=(time.monotonic()-ts)*1000
        print(f"iter {i}: rmeta@{t_meta and round(t_meta,1)} full={t_full:.1f} api={t_api:.1f} rc={pa.returncode}")
        if pa.returncode: print(pa.stderr[-800:])
finally:
    open(SRC,"w").write(original)
