import importlib.util
import json
import os
import shutil
import sys
from datetime import datetime, timezone
from pathlib import Path

os.umask(0o077)
R = Path(__file__).parent
OLD = Path('/tmp/codex/ltb1021/2026-09-14_contextra-rtsp-runtime_r01')
HEAD = 'b0d7d256f6dc3d5050b7a3663ac673793db1a229'
spec = importlib.util.spec_from_file_location('old_preflight', OLD / 'preflight.py')
previous = importlib.util.module_from_spec(spec)
spec.loader.exec_module(previous)
g, api = previous.g, previous.api
sys.path.insert(0, str(g.REPO / 'tools'))
from rtsp_test_manager import Manager

if __name__ == '__main__':
    R.chmod(0o700)
    assert not (R / 'plan.json').exists()
    assert g.sh(['git', '-C', str(g.REPO), 'rev-parse', 'HEAD']).strip() == HEAD
    assert not g.sh(['git', '-C', str(g.REPO), 'status', '--porcelain']).strip()
    old = json.loads((OLD / 'plan.json').read_text())
    c = g.inspect()
    streams = api('/api/v1/streams')['streams']
    assert all(s['state'] == 'stopped' for s in streams)
    addresses = json.loads(g.sh(['ip', '-j', '-4', 'address', 'show']))
    lan = [a for i in addresses if i['ifname'] == 'enp6s18' for a in i['addr_info'] if a['scope'] == 'global']
    assert len(lan) == 1
    plan = dict(old, head=HEAD, started_utc=datetime.now(timezone.utc).isoformat(), analytics=c,
                other_containers=g.others(), streams=streams, lan=lan[0], gpu_mib=g.gpu(),
                normal_restart=c['HostConfig']['RestartPolicy'])
    for key, path in [('env', g.ENV), ('active', Path(old['active'])), ('overlay', Path(old['overlay'])), ('registry', Path(old['registry']))]:
        plan[key + '_hash'] = g.sha(path)
        shutil.copyfile(path, R / (key + '.before'))
    assert all(g.sha(Path(p)) == h for p, h in plan['model_hashes'].items())
    assert g.sha(Path(plan['short_input'])) == plan['original_input']['derived_sha256']
    plan['disk_free'] = shutil.disk_usage(plan['docker_root']).free
    assert plan['disk_free'] >= 15 * 1024**3
    plan['user_senders'] = Manager().containers()
    assert not any(x['State']['Running'] for x in plan['user_senders']), 'NEW_SENDER_USE_CONFLICT'
    (R / 'plan.json').write_text(json.dumps(plan, indent=2))
    (R / 'ledger.json').write_text(json.dumps(dict(started=plan['started_utc'], once=0, builds=0,
        reflected=0, user_sender_started=0, ai_start=0, capacity_failures=0,
        limits=dict(preparation_minutes=20, runtime_minutes=35, sender_seconds=20, sender_cpu=1,
                    sender_ram_mib=512, gpu_devices=0, log_bytes=1048576)), indent=2))
    print(json.dumps(dict(gate='PASS', stream_count=len(streams), all_stopped=True,
        healthy=c['State']['Health']['Status'], sender_count=len(plan['user_senders']),
        disk_gib=round(plan['disk_free']/1024**3, 1), lan_dynamic=lan[0].get('dynamic'))))
