import importlib.util
import json
import os
from pathlib import Path
import shutil
import urllib.request

os.umask(0o077)
R = Path(__file__).parent
s = importlib.util.spec_from_file_location('gate', '/tmp/codex/ltb1021/2026-09-11_service-stop_r01/gate.py')
g = importlib.util.module_from_spec(s)
s.loader.exec_module(g)
HEAD = '8c923717644415755441bb3bc9f9973ec2a19639'

if __name__ == '__main__':
    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()
    c = g.inspect()
    assert c['State']['Health']['Status'] == 'healthy'
    assert c['Image'] == 'sha256:d4a80467d21eabfee0bab25e359bc40d71494c120e9a5dbe2219789e1648d631'
    env = g.load_env_file(str(g.ENV))
    overlay = Path(env['CONTEXTRA_RUNTIME_STATE_ROOT'])/'streams_runtime.yaml'
    active = g.ENV.parent/'metadata-active/compose.yaml'
    opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
    with opener.open('http://127.0.0.1:'+env['FASTAPI_HOST_PORT']+'/api/v1/streams',timeout=3) as f:
        streams = json.load(f)['streams']
    assert len(streams) == 1 and streams[0]['state'] == 'stopped'
    from model_tooling.manifests import validate_input
    manifest = Path('/data/contextra/model-artifacts/inputs/rfdetr/intake-20260909/pose-preview/manifest.yaml')
    intake = validate_input(manifest)
    root = g.sh(['docker','info','--format','{{.DockerRootDir}}']).strip()
    free = shutil.disk_usage(root).free
    assert free >= 15*1024**3
    prior = Path('/tmp/codex/ltb1021/2026-09-13_contextra-capture-isolation_r01/approved-input.json')
    approved = json.loads(prior.read_text())
    assert g.sha(Path(approved['path'])) == approved['hash']
    (R/'approved-input.json').write_bytes(prior.read_bytes())
    for name,path in [('env.before',g.ENV),('overlay.before',overlay),('active-compose.before',active)]:
        (R/name).write_bytes(path.read_bytes())
    plan = dict(started_utc='2026-09-13T10:30:34Z',head=HEAD,analytics=c,
                others=g.others(),gpu_mib=g.gpu(),disk_free=free,
                env_hash=g.sha(g.ENV),overlay=str(overlay),overlay_hash=g.sha(overlay),
                active_hash=g.sha(active),config_hash=g.sha(g.CFG),
                model_hash=g.sha(g.CFG.parent/'2/model.plan'),intake=intake,
                export=dict(cpus=4,memory_gib=12,timeout_s=600,network='none'),
                build_count=0,start_count=0,failures=0)
    (R/'plan.json').write_text(json.dumps(plan,indent=2))
    print(json.dumps(dict(healthy=True,stopped=True,pose_manifest='PASS',disk_gib=round(free/1024**3,1),gpu_mib=plan['gpu_mib'])))
