"""Read-only AI2 receipts: never starts/stops cameras or retries enrolment."""
import json
from pathlib import Path
import shutil
import subprocess
import time
import urllib.request

def docker_code(container, code):
    return json.loads(subprocess.check_output(
        ['docker', 'exec', container, 'python3', '-B', '-c', code], text=True, timeout=15))

assert subprocess.check_output(['hostname'], text=True).strip() == 'icertirnd-ai'
ids = subprocess.check_output(['docker', 'ps', '-aq', '--filter',
                              'label=com.docker.compose.project=contextra-ai2'], text=True).split()
rows = json.loads(subprocess.check_output(['docker', 'inspect', *ids], text=True, timeout=10))
services = {x['Config']['Labels']['com.docker.compose.service']: x for x in rows}
a = services['analytics']
token = Path(next(m['Source'] for m in a['Mounts'] if m['Destination'] == '/run/bridge/control-token')).read_text().strip()

def get(path):
    req = urllib.request.Request('http://127.0.0.1:35000' + path,
                                 headers={'Authorization': 'Bearer ' + token})
    return json.load(urllib.request.urlopen(req, timeout=6))

def sample():
    x = get('/api/v1/streams')
    channels = x.get('streams', []) if isinstance(x, dict) else x
    meta = get('/api/v1/metadata/status')
    return dict(monotonic=time.monotonic(), channels=[{k: c.get(k) for k in
        ('stream_id', 'state', 'required_providers', 'provider_processes', 'publisher_metrics',
         'cleanup_pending', 'last_error', 'cleanup_error')} for c in channels],
        metadata=meta.get('metrics'), artifacts={k: meta.get('artifacts', {}).get(k) for k in
        ('enabled', 'http_enabled', 'active', 'counts', 'error', 'storage_cap_bytes', 'storage_warning')})

first = sample()
time.sleep(5)
second = sample()
training = get('/internal/secure-control/training/settings')
env = dict(v.split('=', 1) for v in a['Config']['Env'])
redis = docker_code(a['Id'], "import os,json,redis;print(json.dumps({'publisher_ping':redis.Redis.from_url(os.environ['CONTEXTRA_METADATA_REDIS_URL']).ping()}))")
sidecar = docker_code(services['ai-control-sidecar']['Id'], '''import json,urllib.request
from pathlib import Path
token=Path('/run/bridge/control-token').read_text().strip()
req=urllib.request.Request('http://127.0.0.1:8080/internal/bridge-status',headers={'Authorization':'Bearer '+token})
r=json.load(urllib.request.urlopen(req,timeout=5))
print(json.dumps(r))''')
result = dict(samples=[first, second], redis=redis, sidecar=sidecar,
    services={s: dict(running=r['State']['Running'], health=r['State'].get('Health', {}).get('Status'),
                       oom=r['State'].get('OOMKilled'), image=r['Image']) for s, r in services.items()},
    storage_env={k: v for k, v in env.items() if any(t in k for t in
        ('CAP_BYTES', 'MIN_FREE', 'RESUME_FREE', 'RETENTION_ENABLED', 'NO_CAPTURE'))},
    training={k: training[k] for k in ('configured', 'effective', 'status')},
    free_bytes={p: shutil.disk_usage(p).free for p in ('/', '/storage')},
    gpu=subprocess.check_output(['nvidia-smi', '--query-gpu=name,driver_version,memory.used,memory.total',
                                 '--format=csv,noheader'], text=True, timeout=8).strip(),
    actual_reboot_tested=False, camera_start_requests_by_agent=0,
    channel_operator='Web-side caller; user confirmation pending')
print(json.dumps(result, ensure_ascii=False))
