import collections
import datetime
import hashlib
import json
import pathlib
import time
import control as c

deadline=time.monotonic()+7200
while not (c.LOCAL/'reports/production_after_render.json').exists():
    if time.monotonic()>deadline: raise TimeoutError('Renderer not finished')
    time.sleep(10)
c.snapshot('final')
before=json.loads((c.LOCAL/'reports/production_before.json').read_text())
after=json.loads((c.LOCAL/'reports/production_final.json').read_text())
seconds=(datetime.datetime.fromisoformat(after['timestamp_utc'])-datetime.datetime.fromisoformat(before['timestamp_utc'])).total_seconds()
changes=[];rates=[]
for key in ['config_sha256','pose_engine_sha256','pose_config_sha256','camera24']:
    if before[key]!=after[key]:changes.append(key)
for key,a in before['streams'].items():
    b=after['streams'][key]
    for field in ['state','run_id','run_generation','child_pid','last_error','cleanup_pending']:
        if a[field]!=b[field]:changes.append(key+':'+field)
    if a['state']=='running' and a['run_id']==b['run_id']:
        rates.extend((n,(v-a['provider_responses'].get(n,0))/seconds) for n,v in b['provider_responses'].items())
assert not changes,changes
assert after['health']['ready']
remaining=c.checked(['docker','ps','-a','--filter','name=contextra-short-r01-','--format','{{.Names}}']).decode().strip()
assert not remaining,remaining
operation={'state_counts':dict(collections.Counter(s['state'] for s in after['streams'].values())),
           'config_model_run_child_unchanged':True,'health_ready':True,'trial_containers_absent':True,
           'observation_seconds':seconds,'provider_completion_rates':[{'provider':n,'fps':round(v,3)} for n,v in rates],
           'scope':'Completion counters only; not browser/Redis FPS or realtime action acceptance.'}
p=c.LOCAL/'reports/operational_comparison.json';p.write_text(json.dumps(operation,indent=2))
c.checked(['mkdir','-p',c.REMOTE+'/download/validation'])
c.scp(str(p),'si@58.233.207.31:'+c.REMOTE+'/download/validation/')
c.scp(str(c.LOCAL/'reports/reuse_integrity.json'),'si@58.233.207.31:'+c.REMOTE+'/download/validation/')
image=c.checked(['docker','inspect','contextra-ai2-analytics-1','--format','{{.Image}}']).decode().strip()
args=['docker','run','--rm','--name','contextra-short-audit-r01','--runtime','runc','--read-only','--network','none','--cpus','2','--memory','8g','--pids-limit','128','-e','NVIDIA_VISIBLE_DEVICES=void','-e','PYTHONDONTWRITEBYTECODE=1','-v',c.REMOTE+':/trial','--entrypoint','python3',image,'/trial/helpers/finalize.py']
data=c.checked(args,timeout=900)
(c.LOCAL/'reports/final_audit.log').write_bytes(data)
print('REMOTE_TECHNICAL_AUDIT_PASS',flush=True)
download=c.LOCAL/'Contextra_Action_Review_20261027'
download.mkdir(exist_ok=False)
c.scp('si@58.233.207.31:'+c.REMOTE+'/download/.',str(download))
expected=json.loads((download/'SHA256SUMS.json').read_text())
for rel,digest in expected.items():
    path=download/rel
    assert path.is_relative_to(download) and path.is_file() and not path.is_symlink()
    assert hashlib.sha256(path.read_bytes()).hexdigest()==digest,rel
assert len(list(download.glob('*/*.mp4')))==56
result=dict(status='PASS',videos=56,files=len(expected),bytes=sum(p.stat().st_size for p in download.rglob('*') if p.is_file()),path=str(download),operational=operation)
(c.LOCAL/'reports/local_transfer_validation.json').write_text(json.dumps(result,indent=2))
print(json.dumps(result),flush=True)
