"""Synthetic OpenCode context-window proof. Requires a fresh T3 dev server,
OpenCode 1.x configured, and agent-browser paired with that server.
Start dev with T3CODE_DEV_SEED=0. Enable the OpenCode instance in Settings.
Usage: reproduce.py seed WORKTREE PROJECT OUTPUT
       reproduce.py capture BROWSER SESSION ORIGIN THREAD_ID OUTPUT
The capture hides only the environment/worktree item to keep host names private.
"""
import datetime
import json
from pathlib import Path
import subprocess
import sys
import time
import urllib.parse
import urllib.request

mode, *args = sys.argv[1:]
if mode == 'seed':
    worktree, project, output = map(Path, args)
    output.mkdir(parents=True, exist_ok=True)
    project.mkdir(parents=True, exist_ok=True)
    (project / 'README.md').write_text('# Context usage demo\n\nSmall synthetic project for verifying context-window reporting.\n')
    for cmd in [['init','-q'], ['add','.'], ['-c','user.name=Demo','-c','user.email=demo@example.invalid','commit','-qm','Initial demo']]:
        subprocess.run(['git',*cmd], cwd=project, check=True)
    cli = ['node', 'apps/server/src/bin.ts']
    def run(*cmd):
        return subprocess.check_output([*cli,*cmd,'--base-dir','.t3'],cwd=worktree,text=True)
    run('project','add',str(project),'--title','Context usage demo')
    one = json.loads(run('thread','start',str(project),'Read README.md and reply with one sentence confirming the project purpose. Do not modify files.','--title','OpenCode context usage','--provider','opencode','--model','opencode/glm-5.3-flash-free','--wait','--json'))
    two = json.loads(run('thread','send',one['threadId'],'Reply with a short confirmation that context usage should be visible after this second turn. Do not modify files.','--wait','--json'))
    (output/'turns.json').write_text(json.dumps([one,two],indent=2))
    print(one['threadId'])
elif mode == 'capture':
    binary, session, origin, thread, parent = args
    output = Path(parent) / datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%SZ')
    output.mkdir(parents=True)
    def ab(*cmd):
        value = subprocess.check_output([binary,'--session',session,*cmd],text=True)
        time.sleep(.4)
        return value
    def click(role,name):
        return ab('find','role',role,'click','--name',name,'--exact')
    environment = json.load(urllib.request.urlopen(origin+'/.well-known/t3/environment'))['environmentId']
    url = origin+'/'+environment+'/'+urllib.parse.quote(thread,safe='')
    ab('set','viewport','1440','1000')
    ab('open',url)
    ab('wait','--text','Confirmed')
    ab('eval','document.activeElement?.blur()')
    ab('record','start',str(output/'context-toggle.webm'))
    click('button','Settings')
    click('button','Appearance')
    click('button','Use dark mode')
    # Both sides already have Context enabled and environment/worktree disabled.
    click('button','Thread details: 10 of 12 on')
    ab('wait','--text','Context window')
    (output/'settings.txt').write_text(ab('snapshot','-i'))
    ab('screenshot',str(output/'context-enabled.png'))
    click('menuitemcheckbox','Context window')
    click('menuitemcheckbox','Context window')
    ab('press','Escape')
    click('button','Close')
    ab('wait','--text','Confirmed')
    ab('eval','document.activeElement?.blur()')
    (output/'thread.txt').write_text(ab('snapshot','-i'))
    # Require identical screenshot pairs at least 500 ms apart.
    for attempt in range(10):
        ab('screenshot',str(output/'check.png'))
        time.sleep(.5)
        ab('screenshot',str(output/'context.png'))
        if (output/'check.png').read_bytes() == (output/'context.png').read_bytes():
            break
    else:
        raise RuntimeError('No stable screenshot pair')
    ab('record','stop')
    print(output)
else:
    raise ValueError(mode)
