import hashlib
import importlib.util
import json
import os
from pathlib import Path
import shutil
import subprocess
import time

_s = importlib.util.spec_from_file_location('old_ops', '/tmp/codex/ltb1021/2026-09-27_sender-training_r01/ops.py')
_m = importlib.util.module_from_spec(_s)
_s.loader.exec_module(_m)
cmd, api, inspect, ledger, training, REPO = (_m.cmd, _m.api, _m.inspect, _m.ledger, _m.training, _m.REPO)
HERE = Path(__file__).parent
PRIVATE = HERE / 'private'
os.umask(0o077)

def save(name, value, private=False):
    root = PRIVATE if private else HERE
    with (root/name).open('x') as f:
        json.dump(value, f, indent=2)

def compose():
    base = _m.compose()
    files = inspect('contextra-analytics-1')['Config']['Labels']['com.docker.compose.project.config_files'].split(',')
    at = base.index('-f')
    return base[:at] + [v for p in files for v in ('-f', p)]

if __name__ == '__main__':
    PRIVATE.mkdir(mode=0o700, exist_ok=False)
    HERE.chmod(0o700)
    containers = {}
    for name in cmd(['docker', 'ps', '-a', '--format', '{{.Names}}']).splitlines():
        c = inspect(name)
        containers[name] = dict(id=c['Id'], image=c['Image'], pid=c['State']['Pid'],
                                running=c['State']['Running'], started=c['State']['StartedAt'])
        if name in ('contextra-analytics-1', 'contextra-ai-control-sidecar-1', 'contextra-ai-gateway-1'):
            save(name+'.json', c, private=True)
    cfg = json.loads(cmd(compose()+['config', '--format', 'json']))
    save('compose.json', cfg, private=True)
    save('compose-command.json', compose(), private=True)
    for n, p in enumerate(inspect('contextra-analytics-1')['Config']['Labels']['com.docker.compose.project.config_files'].split(',')):
        shutil.copy2(p, PRIVATE/f'compose-{n}.before')
    for name, source in {'runtime.env': '/workspace/contextra-runtime-config/runtime.env',
        'secure-bridge.env': '/workspace/contextra-runtime-config/secure-bridge.env',
        'candidate.env': '/workspace/contextra-runtime-config/web-start-candidate-20260918/candidate.env',
        'streams.yaml': '/data/contextra/runtime-state/streams_runtime.yaml'}.items():
        shutil.copy2(source, PRIVATE/name)
        (PRIVATE/name).chmod(0o600)
    rows = api('/api/v1/streams')['streams']
    save('baseline.json', dict(head=cmd(['git','-C',str(REPO),'rev-parse','HEAD']).strip(),
        containers=containers, ledger=ledger(), channels=[{k:r.get(k) for k in
        ('stream_id','source_id','state','child_pid','cleanup_pending')} for r in rows],
        free_bytes=shutil.disk_usage('/').free))
    save('metadata-status.json', api('/api/v1/metadata/status'), private=True)
    save('training.json', training(), private=True)
    print(json.dumps(dict(channels=len(rows), running=[r['stream_id'] for r in rows if r['state']=='running'],
        gateway=containers['contextra-ai-gateway-1']['running'], root_free_gib=shutil.disk_usage('/').free/1024**3)))
