import hashlib
import json
import os
from pathlib import Path
import shutil
import subprocess
import sys
import time

HERE=Path(__file__).parent
REPO=Path('/workspace/contextra-analytics-runtime-lifecycle-refactor')
PRIVATE=Path('/workspace/contextra-runtime-config')
os.umask(0o077);HERE.chmod(0o700)
sys.path.insert(0,str(REPO))
from tools.stream_benchmark import load_config
from tools.stream_benchmark_runtime import Runtime
rt=Runtime(load_config(PRIVATE/'test-run/event-artifact-next.yaml'),HERE)
def save(name,value):
    with (HERE/name).open('x') as out:json.dump(value,out,indent=2)
def cmd(args,timeout=30,input=None):
    p=subprocess.run(args,text=True,capture_output=True,timeout=timeout,input=input)
    if p.returncode:
        save('command-error-'+str(time.time_ns())+'.json',dict(code=p.returncode,stdout=p.stdout,stderr=p.stderr))
        raise RuntimeError('Command failed; evidence saved privately')
    return p.stdout
def ledger():
    sql="SELECT json_build_object('count',count(*),'fresh_delivery',count(*) FILTER (WHERE delivery_state IN ('PENDING','RETRY','CLAIMED','SENDING') AND confirmed_at>extract(epoch from now())-120),'attempts',coalesce(sum(attempts),0)) FROM contextra_event_artifacts;"
    return json.loads(cmd(['docker','exec','-i','contextra-postgresql-1','sh','-c',
        'exec psql -X -qAt -U "$POSTGRES_USER" -d "$POSTGRES_DB"'],input=sql))
candidate=json.loads(Path('/tmp/codex/ltb1021/2026-09-18_contextra-web-start-prep_r01/prepared.json').read_text())
assert not (HERE/'reflect-intent.json').exists()
assert not cmd(['git','-C',str(REPO),'status','--porcelain']).strip()
for p,h in candidate['source_hashes'].items():
    assert hashlib.sha256((REPO/p).read_bytes()).hexdigest()==h,p
assert hashlib.sha256(Path(candidate['template']).read_bytes()).hexdigest()==candidate['template_hashes']['medium']
assert json.loads(cmd(['docker','image','inspect',candidate['image_id']]))[0]['Id']==candidate['image_id']
assert shutil.disk_usage('/var/lib/docker').free>15*1024**3
states=rt.states()
before_ledger=ledger();assert before_ledger['fresh_delivery']==0,'Unexpected fresh old delivery work'
others={n:json.loads(cmd(['docker','inspect',n]))[0]['Id'] for n in ('contextra-ai-control-sidecar-1','contextra-ai-gateway-1','contextra-redis-1','contextra-postgresql-1')}
compose=['docker','compose','-p','contextra','--project-directory',str(REPO),
    '--env-file',str(PRIVATE/'runtime.env'),'--env-file',str(PRIVATE/'secure-bridge.env'),
    '--env-file',candidate['candidate_env'],'-f',str(REPO/'docker-compose.yml'),
    '-f',str(PRIVATE/'metadata-active/compose.yaml'),'-f',str(REPO/'deploy/secure-bridge.compose.yml'),
    '-f',str(REPO/'deploy/web-start.compose.yml')]
merged=json.loads(cmd(compose+['config','--format','json']))
assert merged['services']['analytics']['image']==candidate['image_id']
assert merged['services']['analytics']['environment']['CONTEXTRA_EVENT_ARTIFACT_ENABLED']=='1'
save('before.json',dict(head=cmd(['git','-C',str(REPO),'rev-parse','HEAD']).strip(),
    states=states,ledger=before_ledger,container=rt.inspect()['Id'],other_containers=others,
    compose_command=compose,model_mounts=[m for m in rt.inspect()['Mounts'] if '/models/' in m['Destination']]))
save('reflect-intent.json',dict(at=time.time(),target=candidate['image_id']))
for sid,q in states.items():
    if q['state']=='stopped' and not q.get('child_pid') and not q.get('cleanup_pending'):continue
    print('STOP',sid,flush=True)
    result=rt.stop(sid)
    save('stop-'+hashlib.sha256(sid.encode()).hexdigest()[:16]+'.json',result)
assert not any(q.get('child_pid') or q['state']!='stopped' for q in rt.states().values())
print('ALL_CHANNELS_REAPED',flush=True)
cmd(['docker','stop','--time','85','contextra-analytics-1'],100)
cmd(compose+['up','-d','--no-deps','--no-build','--pull','never','analytics'],180)
deadline=time.monotonic()+120
while time.monotonic()<deadline:
    try:
        if rt.api.call('GET','/ready'):break
    except Exception:pass
    time.sleep(2)
else:raise RuntimeError('READINESS_TIMEOUT; no retry')
actual=rt.inspect()
assert actual['Image']==candidate['image_id']
env=dict(v.split('=',1) for v in actual['Config']['Env'])
assert env['CONTEXTRA_EVENT_ARTIFACT_ENABLED']=='1' and env['CONTEXTRA_ARTIFACT_DELIVERY_CAMERAS']==''
assert env['CONTEXTRA_CONTROL_TEMPLATE_FILE']=='/run/bridge-config/camera-template.json'
assert not any(q.get('child_pid') for q in rt.states().values()),'Unexpected external Start during reflection'
artifacts=rt.api.call('GET','/api/v1/metadata/status')['artifacts']
assert artifacts['enabled'] and artifacts['workers']>0
for n,identity in others.items():assert json.loads(cmd(['docker','inspect',n]))[0]['Id']==identity,n
after_ledger=ledger();assert after_ledger['attempts']==before_ledger['attempts'],'Old event attempted delivery'
models=[m for m in actual['Mounts'] if '/models/' in m['Destination']]
before=json.loads((HERE/'before.json').read_text())
assert sorted(models,key=lambda m:m['Destination'])==sorted(before['model_mounts'],key=lambda m:m['Destination'])
ready=dict(at=time.time(),container_id=actual['Id'],image=actual['Image'],states=rt.states(),artifacts=artifacts,
    ledger=after_ledger,compose_command=compose,other_containers_preserved=True)
save('ready.json',ready)
print(json.dumps(dict(ready=True,artifact_enabled=artifacts['enabled'],workers=artifacts['workers'],
    registration_count=len(ready['states']),running=0,old_event_attempts_unchanged=True)),flush=True)
