import csv
import importlib.util
import json
from pathlib import Path
import yaml

R=Path(__file__).parent
s=importlib.util.spec_from_file_location('ops',R/'ops.py');o=importlib.util.module_from_spec(s);s.loader.exec_module(o);p=o.p
plan=p.read('plan.json');build=p.read('parallel-build.json');rows=[];statistics={}
for label in ('timeline','parallel'):
    data=p.read(label+'-window.json');analysis=p.read(label+'-analysis.json')
    for key,v in analysis.items():rows.append(dict(condition=label,**v['row']))
    a,b=data['samples'][0]['publisher']['metrics'],data['samples'][-1]['publisher']['metrics']
    ra,rb=data['resources'];dt=rb['at']-ra['at']
    statistics[label]=dict(publisher_delta={k:b.get(k,0)-a.get(k,0) for k in ('sent_frames','sent_status','replaced','expired','send_error','byte_limit','message_limit')},
        publisher_queue=[min(x['publisher']['metrics']['queued'] for x in data['samples']),max(x['publisher']['metrics']['queued'] for x in data['samples'])],
        cpu_cores=(rb['cpu']['usage_usec']-ra['cpu']['usage_usec'])/1e6/dt,memory_mib=[ra['memory']/1024**2,rb['memory']/1024**2],gpu=[ra['gpu'],rb['gpu']],
        throttle_delta=rb['cpu']['throttled_usec']-ra['cpu']['throttled_usec'])
with (R/'comparison.csv').open('w') as f:
    writer=csv.DictWriter(f,fieldnames=list(rows[0]));writer.writeheader();writer.writerows(rows)
cur=p.base.inspect('contextra-analytics-1');expected=dict(x.split('=',1) for x in plan['analytics']['Config']['Env'])
expected.update(CONTEXTRA_METADATA_STREAM_LENGTH='100',CONTEXTRA_METADATA_WORKERS='4')
assert cur['Image']==build['image'] and cur['State']['Health']['Status']=='healthy'
assert dict(x.split('=',1) for x in cur['Config']['Env'])==expected
assert cur['HostConfig']['RestartPolicy']==plan['analytics']['HostConfig']['RestartPolicy']
assert sorted(cur['Mounts'],key=lambda x:x['Destination'])==sorted(plan['analytics']['Mounts'],key=lambda x:x['Destination'])
active=yaml.safe_load(p.ACTIVE.read_text())['services']['analytics']
assert active['image']==build['image']
assert active['environment']['CONTEXTRA_METADATA_STREAM_LENGTH']=='100'
assert active['environment']['CONTEXTRA_METADATA_WORKERS']=='4'
for name,value in [('CONTEXTRA_IMAGE',build['tag']),('CONTEXTRA_METADATA_STREAM_LENGTH','100'),('CONTEXTRA_METADATA_WORKERS','4')]:
    assert name+'='+value in p.ENV.read_text().splitlines()
assert p.sha(p.prior.REG)==plan['registry_hash']
assert p.base.inspect('contextra-redis-1')['Id']==plan['redis']
assert p.prior.ops.prior.prev.sender()['executionId']==plan['sender']['executionId']
inv=p.base.inventory();assert {k:v for k,v in inv.items() if k!='/contextra-analytics-1'}=={k:v for k,v in plan['inventory'].items() if k!='/contextra-analytics-1'}
states={src:p.prior.state(sid) for src,sid in p.CHANNELS.items()}
for src,sid in p.CHANNELS.items():
    st=states[src];assert st['state']=='running' and st['last_error'] is None and st['cleanup_error'] is None
    assert not st['metadata_path']['performance']['detail'] and st['metadata_path']['visual'] is None
    assert p.api('/api/v1/streams/'+sid+'/settings')['configured']==plan['settings'][src]['configured']
pub=p.api('/api/v1/metadata/status')['metrics'];assert pub['workers']==4 and not pub['profile']['enabled']
cleanup={label:{sid:p.read(label+'-'+sid+'-cleanup.json')['last_cleanup'] for sid in p.CHANNELS.values()} for label in ('timeline','parallel')}
p.save('final.json',dict(rows=rows,statistics=statistics,states=states,cleanup=cleanup,build=build,
    settings_preserved=True,registry_preserved=True,sender_redis_others_preserved=True,actual_persistent_aligned=True,metrics_off=True))
print(json.dumps(dict(rows=rows,statistics=statistics,cleanup=cleanup,states={s:q['state'] for s,q in states.items()})))
