import os,subprocess,time,threading,sys
ROOT="/Users/oscar/.worktree/hot-reload/labs/hot-reload"
CLI="/Users/oscar/.worktree/hot-reload/target/debug/kan-hot-dev"
SRC=os.path.join(ROOT,"api-common","src","lib.rs")
env=dict(os.environ,RUST_LOG="error",KAN_HOT_TIMING="1",KAN_HOT_EXAMPLE_INTERVAL_MS="1000",KAN_HOT_WARM="0")
p=subprocess.Popen([CLI,"run","--bin","server","--lib","api"],cwd=ROOT,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,env=env,text=True,bufsize=1)
lines=[]
def rd():
    for l in p.stdout:
        lines.append((time.monotonic(),l.strip()))
threading.Thread(target=rd,daemon=True).start()
def wait(pred,to=30):
    d=time.monotonic()+to
    while time.monotonic()<d:
        for t,l in lines:
            if pred(l): return t,l
        time.sleep(0.005)
    raise TimeoutError
wait(lambda l:"gen 1 hello" in l)
orig=open(SRC).read()
for i in range(3):
    mark=f"one-{i}-{time.time_ns()}"
    open(SRC,"w").write(orig.replace("nested-v1",mark))
    t0=time.monotonic()
    t,l=wait(lambda l,m=mark: f'"nested":"{m}"' in l)
    print(f"E2E {1000*(t-t0):.1f}ms")
    time.sleep(1.0)
for t,l in lines:
    if "kan-hot" in l or "loaded" in l: print(f"{t:.3f} {l}")
open(SRC,"w").write(orig)
time.sleep(0.5)
try:
    p.stdin.write("q\n");p.stdin.flush();p.wait(timeout=10)
except Exception: p.kill()
