import hashlib
import json
import os
from pathlib import Path
import shutil
import subprocess
import sys
import urllib.request

ROOT = Path(__file__).parent
os.umask(0o077)
ROOT.chmod(0o700)
def command(args, input=None):
    return subprocess.run(args, input=input, text=True, capture_output=True, check=True, timeout=20).stdout
def get(path):
    with urllib.request.urlopen('http://127.0.0.1:35000'+path, timeout=5) as response:
        return json.load(response)
containers = {}
for name in ('contextra-analytics-1','contextra-ai-control-sidecar-1','contextra-ai-gateway-1'):
    row = json.loads(command(['docker','inspect',name]))[0]
    env = dict(v.split('=',1) for v in row['Config']['Env'])
    containers[name] = dict(id=row['Id'], image=row['Image'], started=row['State']['StartedAt'],
        pid=row['State']['Pid'], mounts=row['Mounts'],
        config_hash=hashlib.sha256(json.dumps(row['Config'],sort_keys=True).encode()).hexdigest(),
        artifact_enabled=env.get('CONTEXTRA_EVENT_ARTIFACT_ENABLED'),
        delivery_cameras=env.get('CONTEXTRA_ARTIFACT_DELIVERY_CAMERAS'),
        template=env.get('CONTEXTRA_CONTROL_TEMPLATE_FILE'))
sql = "SELECT json_build_object('count',count(*),'fingerprint',md5(string_agg(md5(t::text),'' ORDER BY event_id))) FROM contextra_event_artifacts t;"
ledger=json.loads(command(['docker','exec','-i','contextra-postgresql-1','sh','-c',
    'exec psql -X -qAt -U "$POSTGRES_USER" -d "$POSTGRES_DB"'], sql))
states=get('/api/v1/streams')['streams']
stable_states=[{k:s.get(k) for k in ('stream_id','state','observed_state','child_pid','run_id','run_generation')} for s in states]
files=[Path('/workspace/contextra-runtime-config')/p for p in
       ('runtime.env','secure-bridge.env','metadata-active/compose.yaml','test-run/medium16-registry.json')]
value=dict(containers=containers,states=stable_states,ledger=ledger,
    artifacts=get('/api/v1/metadata/status').get('artifacts'),
    files={str(p):hashlib.sha256(p.read_bytes()).hexdigest() for p in files},
    disk_free=shutil.disk_usage('/var/lib/docker').free,
    neighbor=command(['ip','neigh','show','192.168.50.101','dev','enp6s18']).strip(),
    firewall=command(['iptables','-S','CTX_METADATA_LAN']).splitlines())
with (ROOT/(sys.argv[1]+'.json')).open('x') as out: json.dump(value,out,indent=2)
if sys.argv[1]=='after':
    before=json.loads((ROOT/'before.json').read_text())
    for key in ('containers','states','ledger','files','neighbor','firewall'):
        assert value[key]==before[key], key+' changed externally; review required'
print(json.dumps(dict(stage=sys.argv[1],running=[s for s in stable_states if s.get('child_pid')],
    disk_free_gib=round(value['disk_free']/1024**3,2),artifact_enabled=containers['contextra-analytics-1']['artifact_enabled'],
    delivery_cameras=containers['contextra-analytics-1']['delivery_cameras'],ledger_count=ledger['count'])))
