import json,os,pathlib,re,subprocess,urllib.request
from html.parser import HTMLParser
from build import R,g,HEAD,EDITED
os.umask(0o077)
def main():
 assert not (R/'plan.json').exists()
 assert g.sh(['git','-C',str(g.REPO),'rev-parse','HEAD']).strip()==HEAD
 c=g.inspect();assert c['State']['Status']=='running' and c['State']['Health']['Status']=='healthy'
 assert c['Image']=='sha256:6c8f9be70b2644065410e4c6ec14165e26c682b974364c219d1c8b2968eb4e3a'
 env=g.load_env_file(str(g.ENV));overlay=pathlib.Path(env['CONTEXTRA_RUNTIME_STATE_ROOT'])/'streams_runtime.yaml'
 specs=g.yaml.safe_load(overlay.read_text())['added'];assert len(specs)==1;s=specs[0]
 assert all(s[k] is False for k in ['store','active_learning','autostart']) and s['scenarios']=='off'
 opener=urllib.request.build_opener(urllib.request.ProxyHandler({}))
 with opener.open('http://127.0.0.1:'+env['FASTAPI_HOST_PORT']+'/api/v1/streams',timeout=3) as f:
  states=json.load(f)['streams']
 assert len(states)==1 and states[0]['state']=='stopped'
 C=g.ENV.parent/'metadata-active';active=C/'compose.yaml'
 redis=json.loads(g.sh(['docker','inspect','contextra-redis-1']))[0]
 assert redis['State']['Health']['Status']=='healthy'
 cfg=g.yaml.safe_load(active.read_text())
 actual=dict(x.split('=',1) for x in c['Config']['Env'])
 for k in ('REDIS_URL','CONTEXTRA_METADATA_ENABLED','CONTEXTRA_METADATA_REDIS_URL'):
  assert actual[k]==cfg['services']['analytics']['environment'][k]
 assert g.sha(g.CFG)=='5e5a4d22786f8b5218ac821379fbec091d9e3006f62c880ee3e3da5ced2f0e0b'
 assert g.sha(g.CFG.parent/'2/model.plan')=='5fdf1e9c55ab947a3b7d5f7f6bdceaf1e36a9e52efdf86f5a15d3b99b8631d1e'
 class Text(HTMLParser):
  def __init__(self):super().__init__();self.parts=[]
  def handle_data(self,data):self.parts.append(data)
 doc=pathlib.Path('/workspace/260716_아이서티관련문서/260910/(web서버동료제공)2026_09_10_AI 서버 연동.html')
 parser=Text();parser.feed(doc.read_text());text=''.join(parser.parts)
 values={}
 for k in ('startWallTimeMs','rtpClockRate'):
  found=set(re.findall(r'"?'+k+r'"?\s*[:=]\s*(\d+)',text));assert len(found)==1,'AMBIGUOUS_TEST_ANCHOR'
  values[k]=int(found.pop())
 (R/'anchor.json').write_text(json.dumps(dict(sourceId=s['source_id'],synthetic=True,**values)))
 for name,p in [('env.before',g.ENV),('overlay.before',overlay),('active-compose.before',active)]:
  (R/name).write_bytes(p.read_bytes())
 for name in ('visual','diagnostics'):(R/name).mkdir(mode=0o700)
 oldfiles=c['Config']['Labels']['com.docker.compose.project.config_files'].split(',')
 out=dict(analytics=c,redis=redis,env_hash=g.sha(g.ENV),overlay_hash=g.sha(overlay),active_hash=g.sha(active),
  config_hash=g.sha(g.CFG),plan_hash=g.sha(g.CFG.parent/'2/model.plan'),old_files={p:g.sha(p) for p in oldfiles},
  other_containers=g.others(),gpu_mib=g.gpu(),controls=str(C),anchor_document_hash=g.sha(doc),
  anchor_hash=g.sha(R/'anchor.json'),source_hashes={p:g.sha(g.REPO/p) for p in EDITED})
 (R/'plan.json').write_text(json.dumps(out,indent=2));print(json.dumps(dict(actual='healthy/stopped',redis='healthy/preserved',model_hash='PASS',test_anchor='unique values found',source_files=len(EDITED))))
if __name__=='__main__':main()
