import subprocess, pathlib, time, datetime, re, json, os, sys
# Run from the scratch directory containing this script and interfaces.cjs.
root=pathlib.Path(__file__).resolve().parent
run=root/datetime.datetime.now(datetime.timezone.utc).strftime('run-%Y%m%d-%H%M%S');run.mkdir()
checkouts=sys.argv[1:]
for side,cwd in zip(['before','after'],checkouts):
 for mode,flags in [('pairing',['--lan']),('routes',['--host','0.0.0.0'])]:
  log=run/f'{side}-{mode}-raw.log'
  home=run/f'{side}-{mode}-home'
  cmd=['node','--require',str(root/'interfaces.cjs'),'apps/server/src/bin.ts','serve',*flags,'--port','18773','--base-dir',str(home)]
  with log.open('w') as out:
   p=subprocess.Popen(cmd,cwd=cwd,env={**os.environ,'T3CODE_DEV_SEED':'0'},stdout=out,stderr=subprocess.STDOUT)
   try:
    for i in range(180):
     if 'Pairing URL:' in log.read_text():break
     if p.poll() is not None:raise RuntimeError('Server exited; inspect private raw log')
     time.sleep(1)
    else:raise RuntimeError('Startup deadline')
    url=re.search(r'Pairing URL: ([^\s]+)',log.read_text())[1]
    lines=[f'{side.upper()} — real server CLI on Linux; synthetic OS interface enumeration',f'Mode: {mode}',f'Flags: serve {" ".join(flags)} --port 18773', '', 'Interfaces in enumeration order:', '  utun40: 198.19.2.2', '  Local Area Connection* 2: 192.168.137.1', '  en0: 192.168.1.42', '  tailscale0: 100.101.102.103', '', 'Actual CLI output:',f'Pairing URL: {url.split("#")[0]}#token=[REDACTED]']
    if mode=='routes':
     result=subprocess.run(['node',str(root/'read-routes.mjs'),'18773',str(log)],cwd=cwd,capture_output=True,text=True,timeout=90)
     if result.returncode:raise RuntimeError(result.stderr)
     lines+=['','Actual server.getConfig directEndpoints:',result.stdout.strip()]
    (run/f'{side}-{mode}.txt').write_text('\n'.join(lines)+'\n')
   finally:
    p.terminate()
    try:p.wait(timeout=20)
    except subprocess.TimeoutExpired:p.kill();p.wait()
print(run)
