import os,sys,pathlib,subprocess,time,hashlib,json,base64,urllib.request
binary,session,origin,side=sys.argv[1:]
scratch=pathlib.Path(os.environ['PROOF_SCRATCH'])
out=scratch/(side+'-'+time.strftime('%Y%m%d-%H%M%S'));out.mkdir()
def browser(*args):
    r=subprocess.run([binary,'--session',session,*args],check=True,capture_output=True,text=True)
    return r.stdout

def capture(label):
    previous=None
    for i in range(12):
        sample=out/f'{label}-sample-{i}.png'
        browser('screenshot',str(sample));data=sample.read_bytes();digest=hashlib.sha256(data).hexdigest()
        if digest==previous:
            (out/f'{label}.png').write_bytes(data);return
        previous=digest;time.sleep(.5)
    raise RuntimeError('Capture did not stabilize')

browser('open',origin+'/pull-requests')
browser('wait','--text','Fast-forward only: preserve the existing head')
snapshot=browser('snapshot','-i')
if 'button "Close #1"' in snapshot:
    browser('find','role','button','click','--name','Close #1')
browser('record','start',str(out/f'{side}.webm'))
try:
    browser('find','text','Fast-forward only: preserve the existing head','click')
    browser('wait','--text','The feature branch contains main.')
    browser('find','role','button','click','--name','Maximize panel')
    browser('find','role','button','click','--name','More pull request actions')
    (out/'menu.txt').write_text(browser('snapshot'))
    capture('menu')
    browser('press','Escape')
    capture('panel')
    snapshot=browser('snapshot','-i');(out/'panel.txt').write_text(snapshot)
    visible='button "Fast-forward merge"' in snapshot
    result={'mergeControlVisible':visible}
    if visible:
        browser('find','role','button','click','--name','Fast-forward merge')
        browser('wait','--text','Confirm merge?')
        capture('confirm')
        browser('find','role','button','click','--name','Confirm merge?')
        browser('wait','--text','Merged')
        capture('merged')
        (out/'merged.txt').write_text(browser('snapshot'))
        auth=base64.b64encode((os.environ['PROOF_FORGEJO_USER']+':'+os.environ['PROOF_FORGEJO_PASSWORD']).encode()).decode()
        apiOrigin=os.environ['PROOF_FORGEJO_URL']
        repo='scenario/fast-forward-demo'
        def api(path):
            with urllib.request.urlopen(urllib.request.Request(apiOrigin+'/api/v1/'+path,headers={'Authorization':'Basic '+auth})) as r:return json.load(r)
        pr=api(f'repos/{repo}/pulls/1');base=api(f'repos/{repo}/branches/main')
        result.update(merged=pr['merged'],headSha=pr['head']['sha'],baseSha=base['commit']['id'],mergeRequests=[json.loads(x) for x in (scratch/'merge-requests.jsonl').read_text().splitlines()])
    (out/'verification.json').write_text(json.dumps(result,indent=2))
finally:
    browser('record','stop')
print(out.name)
print(json.dumps(result))
