#!/usr/bin/env python3
"""Capture GitLab MR line navigation in an already paired local dev app.
Usage: python3 capture.py PORT SIDE OUTPUT_DIRECTORY
Requires npx agent-browser, ImageMagick compare, and a GitLab CLI project.
"""
import datetime
import pathlib
import subprocess
import sys
import time
import urllib.parse

port, side, output = sys.argv[1:]
out = pathlib.Path(output) / (side + '-' + datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%SZ'))
out.mkdir(parents=True)

def browser(*args):
    return subprocess.run(['npx', '--yes', 'agent-browser', '--session', 'proof34601', *args], check=True, capture_output=True, text=True).stdout

mr = 'https://gitlab.com/gitlab-org/cli/-/merge_requests/4330'
def route(link):
    return f'http://localhost:{port}/pull-requests?' + urllib.parse.urlencode(dict(repository='gitlab-org/cli', number='4330', selectedHost='gitlab.com', selectedUrl=link))

browser('set', 'viewport', '1280', '800')
browser('open', route(mr))
browser('wait', '--text', 'fix(issuable view): fetch all note pages when showing comments')
browser('find', 'role', 'button', 'click', '--name', 'Maximize panel')
browser('find', 'role', 'button', 'click', '--name', 'Summary')
browser('record', 'start', str(out / (side + '.webm')))
try:
    browser('open', route(mr + '/diffs#0cd3702f060909d3161d1095b8347d4d07671427_248_253'))
    browser('wait', 'diffs-container')
    browser('find', 'role', 'button', 'click', '--name', 'Maximize panel')
    for attempt in range(10):
        first, final = out / f'check-{attempt}.png', out / (side + '.png')
        browser('screenshot', str(first))
        time.sleep(0.5)
        browser('screenshot', str(final))
        same = subprocess.run(['compare', '-metric', 'AE', str(first), str(final), 'null:'], capture_output=True, text=True)
        if same.returncode == 0:
            break
    else:
        raise RuntimeError('The final state did not stabilize')
    # Read the rendered diff only; this does not alter app state.
    state = browser('eval', '''JSON.stringify(Array.from(document.querySelectorAll('diffs-container')).map(c => ({file:c.shadowRoot.querySelector('[data-title]')?.textContent, selected:Array.from(c.shadowRoot.querySelectorAll('[data-selected-line]')).map(e=>({line:e.getAttribute('data-column-number'),text:e.textContent,top:e.getBoundingClientRect().top,bottom:e.getBoundingClientRect().bottom}))})))''')
    (out / 'rendered-state.json').write_text(state)
finally:
    browser('record', 'stop')
print(out)
