"""Run a fresh local sample. No provisioning, worker reconfiguration, or log overwrites."""
import argparse
import datetime
import json
import os
from pathlib import Path
import re
import subprocess
import time
import uuid

parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('stage', help='Unique label, e.g. warmup, baseline-1, fixed-1')
parser.add_argument('--output-dir', default='fresh-runs', type=Path)
parser.add_argument('--bazel', default='bazel')
parser.add_argument('--remote-endpoint', default='grpc://127.0.0.1:8980')
parser.add_argument('--remote-instance', default='local-dev')
parser.add_argument('--bes-endpoint', default='grpc://127.0.0.1:50091')
parser.add_argument('--bes-instance', default='local-dev')
parser.add_argument('--bes-user', default='public-example-agent', help='Local development identity, not production authentication')
args = parser.parse_args()
if not re.fullmatch(r'[a-zA-Z0-9_-]+', args.stage):
    parser.error('Stage must contain only letters, digits, underscores, and hyphens')
root = Path(__file__).resolve().parent
output = args.output_dir.resolve()
output.mkdir(parents=True, exist_ok=True)
for extension in ('.run.json', '.log', '.bep.json', '.execution.json'):
    if (output / (args.stage + extension)).exists():
        parser.error('Output already exists; choose a fresh stage or output directory')
image = 'docker://ghcr.io/catthehacker/ubuntu:act-22.04@sha256:dd7654ffb01d5b7b54b23b9ce928a1f7f2d08c7b3d7e320b6574b55d7ccde78b'
invocation = str(uuid.uuid4())
command = [args.bazel, '--ignore_all_rc_files', f'--output_base={output / "bazel-output"}',
    '--host_jvm_args=-Xmx512m', '--batch', 'build', '//:verify',
    '--color=no', '--curses=no', '--noshow_progress', '--jobs=16',
    f'--remote_executor={args.remote_endpoint}', f'--remote_cache={args.remote_endpoint}',
    f'--remote_instance_name={args.remote_instance}', '--remote_default_exec_properties=OSFamily=linux',
    f'--remote_default_exec_properties=container-image={image}',
    f'--bes_backend={args.bes_endpoint}', f'--bes_header=X-Forwarded-User={args.bes_user}',
    f'--bes_instance_name={args.bes_instance}', '--bes_upload_mode=wait_for_upload_complete', '--bes_timeout=30s',
    f'--invocation_id={invocation}', f'--build_event_json_file={output / (args.stage + ".bep.json")}',
    f'--execution_log_json_file={output / (args.stage + ".execution.json")}',
    '--build_metadata=ROLE=public-local-example', '--build_metadata=REPO_URL=https://example.invalid/hermetiq-public-queue-example',
    '--nouse_action_cache', '--disk_cache=', '--remote_accept_cached=false']
started = datetime.datetime.now(datetime.timezone.utc).isoformat()
begin = time.perf_counter()
with (output / (args.stage + '.log')).open('xb') as log:
    process = subprocess.run(command, cwd=root / 'sample', stdout=log, stderr=subprocess.STDOUT,
        env={'PATH': os.environ['PATH'], 'HOME': os.environ['HOME'], 'LANG': 'en_US.UTF-8'})
record = {'stage': args.stage, 'invocationId': invocation, 'startedAt': started,
    'wallSeconds': round(time.perf_counter() - begin, 6), 'exitCode': process.returncode,
    'finishedAt': datetime.datetime.now(datetime.timezone.utc).isoformat(), 'arguments': command}
with (output / (args.stage + '.run.json')).open('x') as dest:
    json.dump(record, dest, indent=2)
    dest.write('\n')
print(json.dumps(record, indent=2))
raise SystemExit(process.returncode)
