#!/usr/bin/env python3
"""The same real-device capture driver is used for both revisions."""
import argparse
import datetime
import json
import pathlib
import re
import subprocess
import time

ROOT = pathlib.Path('/tmp/lead-32840-r1/evidence-capture')
parser = argparse.ArgumentParser()
parser.add_argument('side', choices=['before', 'after'])
parser.add_argument('row', choices=['C1', 'I1', 'I2'])
parser.add_argument('--session', default='evidence-32840-r1')
parser.add_argument('--cold', action='store_true', help='Terminate the app and launch its actual Metro bundle before the still.')
args = parser.parse_args()
run = ROOT / (args.side + '-' + args.row + '-' + datetime.datetime.now(datetime.timezone.utc).isoformat().replace(':', '-'))
run.mkdir()
events = []
def device(*command):
    started = time.monotonic()
    result = subprocess.run(['agent-device', *command, '--session', args.session], cwd='/home/user/wt/pr-32840', text=True, capture_output=True)
    event = {'at': datetime.datetime.now(datetime.timezone.utc).isoformat(), 'command': list(command), 'elapsedSeconds': round(time.monotonic()-started, 3), 'exit': result.returncode, 'stdout': result.stdout, 'stderr': result.stderr}
    events.append(event)
    (run / 'driver-log.json').write_text(json.dumps(events, indent=2))
    if result.returncode: raise RuntimeError(result.stdout + result.stderr)
    return result.stdout
def pause(seconds):
    time.sleep(seconds)
def compare(a, b):
    p = subprocess.run(['compare', '-metric', 'AE', str(a), str(b), 'null:'], text=True, capture_output=True)
    return p.stderr.strip() == '0'

if args.cold:
    device('open', 'com.t3tools.t3code.dev', '--relaunch')
    snapshot = device('snapshot', '-i')
    if 'Open in' in snapshot:
        device('press', 'label="Open"', '--settle')
device('wait', 'text', 'Review guide', '60000')
if args.row == 'C1':
    for attempt in range(6):
        a, b = run / f'settled-{attempt}-a.png', run / f'settled-{attempt}-b.png'
        device('screenshot', str(a))
        pause(0.5)
        device('screenshot', str(b))
        if compare(a, b):
            output = run / f'C1-{args.side}.png'
            output.write_bytes(b.read_bytes())
            print(json.dumps({'capture': str(output), 'pixelIdenticalPair': [str(a), str(b)], 'requestedGapSeconds': 0.5}))
            break
    else: raise RuntimeError('No pixel-identical settled pair; do not publish a still.')
else:
    video = run / f'{args.row}-{args.side}.mp4'
    device('record', 'start', str(video), '--scope', 'device', '--fps', '30', '--hide-touches')
    started = time.monotonic()
    steps = []
    try:
        pause(2)
        steps.append({'secondsAfterRecordStartReturned': round(time.monotonic()-started, 3), 'step': 'Tap New chat' if args.row == 'I1' else 'Tap PRs'})
        device('press', 'label="New chat"' if args.row == 'I1' else 'label="PRs"', '--settle')
        if args.row == 'I1':
            device('wait', 'text', 'Choose project', '20000')
        pause(3)
        steps.append({'secondsAfterRecordStartReturned': round(time.monotonic()-started, 3), 'step': 'Back to Chats' if args.row == 'I1' else 'Tap Chats'})
        if args.row == 'I1':
            current = device('snapshot', '-i')
            back = re.search(r'(@e\d+(?:~s\d+)?) \[button\] "BackButton"', current)
            if not back: raise RuntimeError('The native BackButton is absent; reject this take.')
            device('press', back.group(1), '--settle')
        else: device('press', 'label="Chats"', '--settle')
        device('wait', 'text', 'Review guide', '20000')
        pause(3)
    finally:
        device('record', 'stop')
        (run / 'steps.json').write_text(json.dumps(steps, indent=2))
    print(json.dumps({'recording': str(video), 'steps': steps}))
