"""Start only the installed AI2 stack; inspect readiness without starting any camera."""
import json
import os
from pathlib import Path
import subprocess
import time
import urllib.request

STAGE=Path('/storage/contextra/deploy/ai2-20261006-r01')
PROJECT='contextra-ai2'
os.umask(0o077)
assert subprocess.check_output(['hostname']).decode().strip()=='icertirnd-ai'
with (STAGE/'start-r01.log').open('x') as log:
    r=subprocess.run(['/usr/local/bin/ct','start'],stdout=log,stderr=log,timeout=300)
assert r.returncode==0,'CT_START_FAILED'
print('FIVE_SERVICES_START_REQUESTED',flush=True)
deadline=time.monotonic()+160
def inventory():
    ids=subprocess.check_output(['docker','ps','-aq','--filter','label=com.docker.compose.project='+PROJECT],text=True,timeout=10).split()
    rows=json.loads(subprocess.check_output(['docker','inspect',*ids],text=True,timeout=10))
    return {x['Config']['Labels']['com.docker.compose.service']:dict(id=x['Id'],image=x['Image'],running=x['State']['Running'],
        oom=x['State'].get('OOMKilled'),health=x['State'].get('Health',{}).get('Status'),exit=x['State']['ExitCode']) for x in rows}
while True:
    rows=inventory()
    assert len(rows)==5 and all(x['running'] and not x['oom'] for x in rows.values()),'SERVICE_EXIT_OR_OOM'
    if all(x['health'] in (None,'healthy') for x in rows.values()):break
    if time.monotonic()>deadline:raise RuntimeError('READINESS_TIMEOUT')
    time.sleep(2)
models_code='''import json,urllib.request
out={}
for name in ('RFDETRMedium','RFDETRKeypointPreview','RFDETRFireSmoke','Awiros_person_and_head_detection'):
 config=json.load(urllib.request.urlopen('http://127.0.0.1:8000/v2/models/'+name+'/config',timeout=4))
 assert config['max_batch_size']==8 and config['version_policy']['specific']['versions']==[8]
 assert config['dynamic_batching']['preferred_batch_size']==[8] and all(x['count']==8 for x in config['instance_group'])
 out[name]={'ready':urllib.request.urlopen('http://127.0.0.1:8000/v2/models/'+name+'/ready',timeout=4).status,'batch':8,'instances':8,'version':8}
print(json.dumps(out))'''
models=json.loads(subprocess.check_output(['docker','exec',rows['analytics']['id'],'python3','-B','-c',models_code],text=True,timeout=30))
with urllib.request.urlopen('http://127.0.0.1:35000/api/v1/streams',timeout=5) as response:
    channels=json.load(response)
channels=channels.get('streams',[]) if isinstance(channels,dict) else channels
states=[{k:r.get(k) for k in ('camera_id','id','state','child_pid')} for r in channels]
result={'services':rows,'models':models,'channels':states,
        'gpu':subprocess.check_output(['nvidia-smi','--query-gpu=name,driver_version,memory.used,memory.total','--format=csv,noheader'],text=True,timeout=10).strip(),
        'camera_start_requests_by_agent':0}
(STAGE/'readiness-r01.json').write_text(json.dumps(result,indent=2))
print(json.dumps(result),flush=True)
