from ops import *
image=json.loads((HERE/'image.json').read_text())
baseline=json.loads((HERE/'baseline.json').read_text())
policy={'CONTEXTRA_SINGLE_DECODE_MULTIPROVIDER':'true','CONTEXTRA_CHANNEL_PROCESS_LIMIT':'0',
        'CONTEXTRA_PROVIDER_RESULT_FRESHNESS_MS':'100','CONTEXTRA_PROVIDER_STALL_SECONDS':'2.0'}
expected=json.loads((PRIVATE/'compose-before.json').read_text())
expected['services']['analytics']['image']=image['id']
expected['services']['analytics']['environment'].update(policy)
actual=json.loads(cmd(compose()+['config','--format','json']))
assert actual==expected,'Unexpected Compose change'
rows=api('/api/v1/streams')['streams']
assert all(r['state']=='stopped' and not r.get('child_pid') and not r.get('cleanup_pending') for r in rows)
assert ledger()==baseline['ledger']
assert shutil.disk_usage('/').free>15*1024**3
save('reflect-intent.json',dict(image=image,policy=policy,channels=len(rows)))
save('compose-after.json',actual,private=True)
try:
    cmd(['docker','stop','--signal=SIGTERM','--timeout=-1','contextra-ai-gateway-1'],timeout=90)
    cmd(['docker','stop','--signal=SIGTERM','--timeout=-1','contextra-analytics-1'],timeout=90)
    cmd(compose()+['up','-d','--no-deps','--no-build','--pull','never','analytics'],timeout=150)
    deadline=time.monotonic()+140
    while True:
        try:ready=api('/ready');break
        except Exception:
            if time.monotonic()>deadline:raise RuntimeError('ANALYTICS_READINESS_TIMEOUT')
            time.sleep(2)
    c=inspect('contextra-analytics-1');assert c['Image']==image['id']
    env=dict(x.split('=',1) for x in c['Config']['Env'])
    assert all(env[k]==v for k,v in policy.items())
    models=json.loads(cmd(['docker','exec','contextra-analytics-1','python3','-B','-c',
        'import urllib.request,json;print(json.dumps({m:urllib.request.urlopen("http://127.0.0.1:8000/v2/models/"+m+"/ready",timeout=3).status for m in ["RFDETRMedium","RFDETRKeypointPreview","RFDETRFireSmoke","Awiros_person_and_head_detection"]}))']))
    artifacts=api('/api/v1/metadata/status')['artifacts']
    assert artifacts['enabled'] and artifacts['http_enabled']
    rows=api('/api/v1/streams')['streams']
    assert all(r['state']=='stopped' and not r.get('child_pid') and not r.get('cleanup_pending') for r in rows)
    assert ledger()==baseline['ledger']
    save('reflected.json',dict(ready=ready,image=image,policy=policy,models=models,channels_stopped=len(rows),
        artifacts={k:artifacts[k] for k in ('enabled','http_enabled')},gateway='MAINTENANCE_STOPPED'))
    print(json.dumps(dict(models=models,stopped=len(rows),artifact_on=True,gateway='MAINTENANCE_STOPPED')))
except Exception as e:
    save('reflection-failed.json',dict(type=type(e).__name__,reason=str(e)[:150]))
    for n in ('contextra-ai-gateway-1','contextra-analytics-1'):
        if inspect(n)['State']['Running']:
            cmd(['docker','stop','--signal=SIGTERM','--timeout=-1',n],timeout=90)
    raise
