import time
from runtime import p, R, REPO, ORIGINAL, states, stop, start

assert not (R/'rollback-start.json').exists()
plan=p.read('plan.json');applied=p.read('applied.json')
assert p.sha(p.ACTIVE)==applied['active_sha'] and p.sha(p.ENV)==applied['env_sha']
assert p.base.inspect('contextra-analytics-1')['Image']==p.read('image.json')['image']
assert all(sid in ORIGINAL or p.quiescent(q) for sid,q in states().items())
p.save('rollback-start.json',dict(at=time.time(),reason='Restored Medium3 result FPS4.4-5.1 and stale increasing; restore exact baseline image/model/compose/env'))
for sid in ORIGINAL:p.save(sid+'-rollback-cleanup.json',stop(sid))
p.atomic(p.ACTIVE,(R/'active.before').read_bytes(),applied['active_sha'])
p.atomic(p.ENV,(R/'env.before').read_bytes(),applied['env_sha'])
command=['docker','compose','--env-file',str(p.ENV),'-f',str(REPO/'docker-compose.yml'),'-f',str(p.ACTIVE)]
p.cmd(command+['config','--quiet']);p.cmd(command+['up','--no-start','--no-deps','--force-recreate','--pull','never','analytics'])
p.cmd(['docker','start','contextra-analytics-1'])
end=time.monotonic()+120
while time.monotonic()<end:
    current=p.base.inspect('contextra-analytics-1')
    if current['State'].get('Health',{}).get('Status')=='healthy':break
    time.sleep(1)
else:raise RuntimeError('ROLLBACK_READINESS_FAILED')
assert current['Image']==plan['analytics']['Image']
for sid in ORIGINAL:start(sid)
time.sleep(5)
t=time.monotonic();a=states();time.sleep(5);b=states();dt=time.monotonic()-t
report={sid:dict(state=b[sid]['state'],fps_reference=(b[sid]['metadata_path']['processed']-a[sid]['metadata_path']['processed'])/dt,
    queue=b[sid]['metadata_path']['queued'],stale_delta=b[sid]['metadata_path'].get('stale',0)-a[sid]['metadata_path'].get('stale',0)) for sid in ORIGINAL}
assert p.sha(p.ACTIVE)==plan['active_hash'] and p.sha(p.ENV)==plan['env_hash']
p.save('rollback-final.json',dict(at=time.time(),channels=report,states=b,image=current['Image'],
    active_persistent_restored=True,publisher=p.api('/api/v1/metadata/status')))
print(report,flush=True)
