#!/usr/bin/env python3
import base64
import hashlib
import json
import shlex
import subprocess
import sys
from pathlib import Path
root=Path(__file__).parent
lane=sys.argv[1];assert lane in ('B','C')
gate='--gate' in sys.argv
assert lane=='C'
plan=(root/'probe2b-full77-time-proposal.json').read_bytes()
assert hashlib.sha256(plan).hexdigest()=='89343d0caf38bb47b863e6b70e731bbfeb8a10f3a4116ddf1019d5375c96e0fc'
expected={}
for key in ('B','C'):
 events=[json.loads(line)for line in(root/'probe2a-private-evidence'/(key+'-probe2a.jsonl')).read_text().splitlines()]
 expected[key]=next(event['data']for event in events if event['kind']=='business-after')
assert hashlib.sha256((root/'probe2a-private-evidence/manifest.json').read_bytes()).hexdigest()=='2521aa96f70aaccee1a16e41665053895b7527b8e812f29214731868ea3b01b8'
overlay_raw=(root/'probe2b-C-recovery-overlay.json').read_bytes()
assert hashlib.sha256(overlay_raw).hexdigest()=='4c10852620ee6b19dd3ef27050f4f8fc51379d9c2d56879da785e27fe6e161b9'
overlay=json.loads(overlay_raw)
private=root/'probe2b-private-evidence'
assert hashlib.sha256((private/'C-probe2b.jsonl').read_bytes()).hexdigest()==overlay['original_C_raw_sha256']
recovery={}
for key,filename in [('preflight','C-recovery-preflight.json'),('deps','C-recovery-dependencies.json'),('user_deps','C-recovery-user-dependencies.json')]:
 content=(private/filename).read_bytes()
 assert hashlib.sha256(content).hexdigest()==overlay['readonly_recovery_files'][filename]
 recovery[key]=json.loads(content)
prefix='<?php\n$plan=json_decode(base64_decode('+repr(base64.b64encode(plan).decode())+'),true);\n$expected=json_decode(base64_decode('+repr(base64.b64encode(json.dumps(expected,ensure_ascii=False).encode()).decode())+'),true);\n'
prefix+='$overlay=json_decode(base64_decode('+repr(base64.b64encode(overlay_raw).decode())+'),true);\n$recovery=json_decode(base64_decode('+repr(base64.b64encode(json.dumps(recovery,ensure_ascii=False).encode()).decode())+'),true);\n'

payload=prefix.encode()+(root/'probe2b-continue-run.php').read_bytes().removeprefix(b'<?php')
pid=10001 if lane=='B'else 112175
php='/usr/local/php7.3/bin/php'if lane=='B'else'/www/server/php/73/bin/php'
child=php if lane=='B'else php+' -c /www/server/php/73/etc/php-cli.ini -d extension=/home/dmdba/dmdbms/drivers/php_pdo/libphp73_dm.so -d extension=/home/dmdba/dmdbms/drivers/php_pdo/php73_pdo_dm.so'
parent='/tmp/zhct-http-store-mysql.dQTTBP'if lane=='B'else'/tmp/zhct-dm-poc-20260928.fcpiiN/store'
wrapper='$env=[];foreach(explode(chr(0),file_get_contents("/proc/'+str(pid)+'/environ"))as $s){$v=explode("=",$s,2);if(count($v)===2)$env[$v[0]]=$v[1];}if(($env["POC_EXTERNAL_STUBS"]??"")!=="1"||($env["POC_REAL_QUEUE"]??"0")!=="0")exit(78);$env["SS_LANE"]="'+lane+'";$env["SS_ROOT"]="'+parent+'";$env["SS_GATE_TEST"]="'+('1'if gate else'0')+'";$p=proc_open('+repr(child)+',[0=>STDIN,1=>STDOUT,2=>STDERR],$pipes,null,$env);exit(proc_close($p));'
args=['docker','exec','-i','zhctapp_v2_0',php,'-r',wrapper]if lane=='B'else['ssh','-S','/private/tmp/cdx-train-root-20261010.sock','-o','BatchMode=yes','root@121.43.241.161',php+' -r '+shlex.quote(wrapper)]
if gate:
 result=subprocess.run(args,input=payload,stdout=subprocess.PIPE,stderr=subprocess.PIPE,check=False)
 print(result.stdout.decode());print(result.stderr.decode(),file=sys.stderr);raise SystemExit(result.returncode)
private=root/'probe2b-private-evidence';private.mkdir(mode=0o700,exist_ok=True)
with(private/(lane+'-continuation.jsonl')).open('xb')as output,(private/(lane+'-continuation.stderr')).open('xb')as error:
 (private/(lane+'-continuation.jsonl')).chmod(0o600);(private/(lane+'-continuation.stderr')).chmod(0o600)
 result=subprocess.run(args,input=payload,stdout=output,stderr=error,check=False)
print(lane,'probe2B exit',result.returncode)
last=(private/(lane+'-continuation.jsonl')).read_text().splitlines()
if last:
 event=json.loads(last[-1])
 if event['kind']=='summary':
  event['data']['case_results_count']=len(event['data'].pop('case_results',[]))
 print(json.dumps(event,ensure_ascii=False))
raise SystemExit(result.returncode)
