#!/usr/bin/env python3
"""Run the same fixtures and head test file in the two prepared checkouts."""
import datetime
import hashlib
import json
import os
from pathlib import Path
import shutil
import subprocess

HERE = Path(__file__).resolve().parent
BASE = Path('/home/ubuntu/wt/pr-29466-base')
HEAD = Path('/home/ubuntu/wt/pr-29466')
BEFORE = 'c8a601c0dfa5c7626e51e06d727076f6b840a005'
AFTER = '9544eafae3b4db17e3e826cb3a7fb90612746f45'
for tree, sha in [(BASE, BEFORE), (HEAD, AFTER)]:
    assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=tree, text=True).strip() == sha
    assert not subprocess.check_output(['git', 'status', '--porcelain'], cwd=tree, text=True).strip()

run = HERE / ('run-' + datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%S.%fZ'))
run.mkdir()
test_relative = Path('apps/server/src/device/easProjectId.test.ts')
base_test = (BASE / test_relative).read_bytes()
head_test = (HEAD / test_relative).read_bytes()
(run / 'original-base-easProjectId.test.ts').write_bytes(base_test)
(run / 'head-easProjectId.test.ts').write_bytes(head_test)
shutil.copyfile(HERE / 'capture-fixtures.json', run / 'capture-fixtures.json')
commands = []
try:
    (BASE / test_relative).write_bytes(head_test)
    for side, tree in [('before', BASE), ('after', HEAD)]:
        server = tree / 'apps/server'
        target = server / 'evidence-29466-runtime-driver.ts'
        shutil.copyfile(HERE / 'runtime-driver.ts', target)
        scanner = server / 'src/device/easProjectId.ts'
        shutil.copyfile(scanner, run / (side + '-easProjectId.ts'))
        driver_command = ['node', 'evidence-29466-runtime-driver.ts', str(run / 'capture-fixtures.json'), str(run), side]
        with (run / (side + '-runtime.log')).open('w') as log:
            result = subprocess.run(driver_command, cwd=server, stdout=log, stderr=subprocess.STDOUT)
        commands.append({'side': side, 'cwd': str(server), 'command': driver_command, 'exit': result.returncode})
        if result.returncode:
            raise RuntimeError(f'{side} runtime failed; see raw log in {run}')
        test_command = ['vp', 'test', 'run', 'apps/server/src/device/easProjectId.test.ts']
        with (run / (side + '-test.log')).open('w') as log:
            log.write('$ vp test run apps/server/src/device/easProjectId.test.ts\n')
            log.write(f'cwd: {tree}; scanner: {BEFORE if side == "before" else AFTER}\n')
            log.write(f'head test SHA256: {hashlib.sha256(head_test).hexdigest()}\n\n')
            log.flush()
            result = subprocess.run(test_command, cwd=tree, stdout=log, stderr=subprocess.STDOUT)
            log.write(f'\nexit code: {result.returncode}\n')
        commands.append({'side': side, 'cwd': str(tree), 'command': test_command, 'exit': result.returncode})
finally:
    (BASE / test_relative).write_bytes(base_test)
    subprocess.run(['rm', '-f', '/home/ubuntu/wt/pr-29466-base/apps/server/evidence-29466-runtime-driver.ts'], check=True)
    subprocess.run(['rm', '-f', '/home/ubuntu/wt/pr-29466/apps/server/evidence-29466-runtime-driver.ts'], check=True)
    (run / 'commands.json').write_text(json.dumps(commands, indent=2) + '\n')
    statuses = {str(tree): subprocess.check_output(['git', 'status', '--porcelain'], cwd=tree, text=True) for tree in [BASE, HEAD]}
    (run / 'final-status.json').write_text(json.dumps(statuses, indent=2) + '\n')
print(run)
