import datetime
import hashlib
import json
import os
from pathlib import Path
import shutil
import subprocess
import sys
import time
import psutil

ROOT = Path(r'C:\Users\decid\Documents\projects\spt-core')
TREE = ROOT / '.worktrees/297-enforcement-shape'
PROOF = ROOT / '.spt/preserved/297-enforcement-shape'
label, *argv = sys.argv[1:]
assert argv and label.replace('-', '').replace('_', '').isalnum()
env = {key: value for key, value in os.environ.items() if not key.startswith(('OWL_', 'SPT_'))}
env.update(CARGO_TARGET_DIR=str(TREE / 'target'), CARGO_BUILD_JOBS='2', CARGO_INCREMENTAL='0', CARGO_TERM_COLOR='never')
free = shutil.disk_usage(TREE).free
assert free > 32 * 1024**3, free
receipt = {'label': label, 'argv': argv, 'cwd': str(TREE), 'environment_names': sorted(env),
           'owl_spt_names': [key for key in env if key.startswith(('OWL_', 'SPT_'))],
           'started_utc': datetime.datetime.now(datetime.timezone.utc).isoformat(),
           'free_before': free, 'min_free_bytes': free, 'samples': []}
log = PROOF / (label + '.log')
with log.open('x', encoding='utf-8') as output:
    child = subprocess.Popen(argv, cwd=TREE, env=env, stdout=output, stderr=subprocess.STDOUT)
    owned = psutil.Process(child.pid)
    while child.poll() is None:
        free = shutil.disk_usage(TREE).free
        receipt['min_free_bytes'] = min(receipt['min_free_bytes'], free)
        receipt['samples'].append({'time': time.time(), 'free_bytes': free})
        if free <= 32 * 1024**3:
            descendants = owned.children(recursive=True)
            owned.kill()
            for proc in descendants:
                try:
                    if proc.is_running():
                        proc.kill()
                except psutil.NoSuchProcess:
                    pass
            receipt['capacity_abort'] = True
            break
        time.sleep(5)
    receipt['exit'] = child.wait()
receipt['ended_utc'] = datetime.datetime.now(datetime.timezone.utc).isoformat()
receipt['free_after'] = shutil.disk_usage(TREE).free
receipt['log_sha256'] = hashlib.sha256(log.read_bytes()).hexdigest()
receipt['summary_lines'] = [line for line in log.read_text(encoding='utf-8', errors='replace').splitlines() if 'Summary' in line or 'Finished' in line or 'error:' in line]
(PROOF / (label + '-receipt.json')).write_text(json.dumps(receipt, indent=2))
print(json.dumps(receipt, indent=2), flush=True)
raise SystemExit(receipt['exit'])
