import json,os,pathlib,urllib.request
from preflight import R,g
os.umask(0o077)
plan=json.loads((R/'plan.json').read_text());run=json.loads((R/'run.json').read_text());built=json.loads((R/'build.json').read_text())
assert run['stage']=='completed' and run['final']['success']
c=g.inspect();assert c['Image']==built['image_id'] and c['State']['Health']['Status']=='healthy'
assert c['HostConfig']['RestartPolicy']==plan['analytics']['HostConfig']['RestartPolicy']
env=g.load_env_file(str(g.ENV));active=g.ENV.parent/'metadata-active/compose.yaml'
cfg=g.yaml.safe_load(active.read_text());assert cfg['services']['analytics']['image']==built['image_id']
assert env['CONTEXTRA_IMAGE']==built['tag']
actual=dict(x.split('=',1) for x in c['Config']['Env'])
for k in ('REDIS_URL','CONTEXTRA_METADATA_ENABLED','CONTEXTRA_METADATA_REDIS_URL'):
    assert actual[k]==cfg['services']['analytics']['environment'][k]
assert actual['CONTEXTRA_TEST_FRAME_ANCHOR_FILE']==''
overlay=pathlib.Path(env['CONTEXTRA_RUNTIME_STATE_ROOT'])/'streams_runtime.yaml'
spec=g.yaml.safe_load(overlay.read_text())['added'][0]
assert spec['visualization']['score_threshold']==.25 and spec['frame_time_anchor']['synthetic'] is True
assert not spec['autostart'] and not spec['store'] and not spec['active_learning'] and spec['scenarios']=='off'
assert g.others()==plan['other_containers']
assert g.sha(g.CFG)==plan['config_hash'] and g.sha(g.CFG.parent/'2/model.plan')==plan['plan_hash']
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:
    rows=json.load(f)['streams']
assert len(rows)==1 and rows[0]['state']=='stopped'
assert not (R/'visual/capture.enabled').exists()
samples=[json.loads(p.read_text()) for p in (R/'samples').glob('*.json')];assert len(samples)==3
for v in samples:
    assert all(o['confidence']>.25 and len(o['bbox'])==4 and 0<=o['bbox'][0]<=o['bbox'][2]<=1 and 0<=o['bbox'][1]<=o['bbox'][3]<=1 for o in v['objects'])
    assert (v['frameWidth'],v['frameHeight'])==(1920,1080)
    assert v['frameTime']['syncStatus']=='ESTIMATED' and v['frameTime']['timeSource']=='SYNTHETIC_TEST_ANCHOR'
log=(R/'runtime.private.log').read_text()
assert all(v not in log for v in json.loads((active.parent/'secrets.json').read_text()).values())
out=dict(analytics='healthy',stream='stopped',image=built['image_id'],display_score=.25,rtp_frame_redis='PASS',visual_matches=3,track_id='not_observed',sdk_cleanup_s=rows[0]['last_cleanup']['elapsed_s'],gpu_mib=g.gpu(),model_auth_non_targets='preserved',capture='Off',restart='on-failure:3',test_anchor='RETAIN explicit synthetic camera setting until integration replacement/removal',diagnostics='RETAIN current container until next approved recreate')
(R/'final.json').write_text(json.dumps(out,indent=2));print(json.dumps(out))
budget=json.loads((R/'budget.json').read_text());budget['next']='completed; owner/closeout only'
(R/'budget.json').write_text(json.dumps(budget,indent=2))
