import json
from pathlib import Path
import sys
import remote

ROOT=Path(__file__).resolve().parent
name=sys.argv[1]
cutoff=json.loads((ROOT/'before-switch.json').read_text())['app']['blocked_time']['cutoff'] if name!='before-switch' else None
code='''
import hashlib,json,subprocess,sys
from pathlib import Path
sys.path.insert(0,'/usr/local/lib/contextra-maintenance/portable-20261006T192646')
import compose_backend as cb, server_context as server
a,site,cp,base,live,source=cb.inspect()
rows=cb.containers()
services={r['Config']['Labels']['com.docker.compose.service']:r for r in rows}
app=services[server.service('analytics')]
args=['docker','exec','-i']
if CUTOFF is not None:args+=['-e','HOTFIX_LEDGER_CUTOFF='+str(CUTOFF)]
p=subprocess.run(args+[app['Id'],'python3','-'],input=PROBE.encode(),capture_output=True,timeout=60)
assert p.returncode==0,p.stderr.decode()[-1500:]
out={'active':a,'app':json.loads(p.stdout),'services':{}}
for role,r in services.items():
    cfg=dict(r['Config']);cfg.pop('Image',None);cfg.pop('Hostname',None)
    labels=dict(cfg.get('Labels') or {})
    labels={k:v for k,v in labels.items() if not k.startswith('com.docker.compose.')}
    cfg['Labels']=labels
    mounts=[{k:m.get(k) for k in ('Type','Source','Destination','RW')} for m in r['Mounts']]
    out['services'][role]={'id':r['Id'],'image':r['Image'],'state':r['State']['Status'],
        'config_sha256':cb.canonical(cfg),'mounts_sha256':cb.canonical(sorted(mounts,key=lambda m:m['Destination'])),
        'restart':r['HostConfig']['RestartPolicy']}
out['source_stamp']=cb.canonical(source)
print(json.dumps(out))
'''
out=remote.run('PROBE='+repr((ROOT/'app_probe.py').read_text())+'\nCUTOFF='+repr(cutoff)+'\n'+code,root=True,timeout=90)
remote.save(name+'.json',out)
v=json.loads(out)
print(json.dumps({'active':v['active']['transaction'],'services':{k:(r['state'],r['image'][:19]) for k,r in v['services'].items()},
    'runtime':v['app']['runtime'],'ready':v['app']['ready'],'models':v['app']['models'],
    'blocked_time':v['app']['blocked_time']},indent=2))
