#!/usr/bin/env python3
import os, re, subprocess, sys, threading, time

LAB = "/Users/oscar/.worktree/hot-reload/labs/hot-reload"
CLI = "/Users/oscar/.worktree/hot-reload/target/debug/kan-hot-dev"
SRC = os.path.join(LAB, "api-common/src/lib.rs")

env = dict(os.environ, RUST_LOG="info", KAN_HOT_TIMING="1", KAN_HOT_EXAMPLE_INTERVAL_MS="50")
p = subprocess.Popen([CLI, "run", "--bin", "server", "--lib", "api"], cwd=LAB,
                     stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
                     env=env, text=True, bufsize=1)
lines = []
lock = threading.Lock()

def reader():
    for line in p.stdout:
        with lock:
            lines.append((time.monotonic(), line.rstrip()))
threading.Thread(target=reader, daemon=True).start()

def wait(pred, timeout=30):
    end = time.monotonic() + timeout
    while time.monotonic() < end:
        with lock:
            for t, l in reversed(lines):
                if pred(l):
                    return t
        time.sleep(0.002)
    raise TimeoutError

wait(lambda l: "gen 1 hello" in l)
original = open(SRC).read()
marker = f"ana-{os.getpid()}-{time.time_ns()}"
open(SRC, "w").write(original.replace("nested-v1", marker))
start = time.monotonic()
wait(lambda l: marker in l and "nested" in l)
time.sleep(0.3)
try:
    p.stdin.write("q\n"); p.stdin.flush()
except BrokenPipeError:
    pass
p.wait(timeout=10)
open(SRC, "w").write(original)

with lock:
    selected = [(t, l) for t, l in lines if start - 0.05 <= t]
print(f"edit at t=0")
for t, l in selected:
    if any(k in l for k in ("change detected", "cargo hot build", "thin link", "codesign", "reloaded",
                            "loaded generation", "dlopen", marker, "hello ->")):
        print(f"t+{(t-start)*1000:7.1f}ms  {l[:140]}")
