<?php
declare(strict_types=1);require __DIR__.'/native.php';ck($lane==='C'&&file_exists($runtime.'/retry-path-preconditions.json'),'Only approved C prepay retry once');$ids=json_decode(file_get_contents($runtime.'/prepared.json'),true)['ids'];ck(file_exists($runtime.'/guard.json')&&!file_exists($runtime.'/run-C-resume-attempt.json'),'Guard and exact HTTP once');$tokens=json_decode(file_get_contents($runtime.'/tokens.json'),true);$pre=['type'=>'200','torderid'=>(string)$ids['STORE_P1']];$pay=['restaurant_id'=>$ids['STORE_R1'],'money'=>'0.01','remark'=>'CDXCORE11S1_DIRECT'];$cases=[];foreach([
 ['PREPAY_FIRST_RETRY1','/api/PrepayOrder/scan','U1',$pre,200,'订单创建成功'],['PREPAY_REPEAT','/api/PrepayOrder/scan','U1',$pre,200,'订单创建成功'],['PREPAY_OTHER','/api/PrepayOrder/scan','U2',$pre,500,'预扣款订单已被其他用户绑定'],['PREPAY_ZERO','/api/PrepayOrder/scan','U1',['type'=>'200','torderid'=>'0'],500,'缺少预扣款订单参数'],['DIRECT_ZERO','/api/mealCheckout/directPay','U1',['restaurant_id'=>$ids['STORE_R1'],'money'=>'0','remark'=>'CDXCORE11S1_DIRECT'],500,'支付金额必须大于0'],['DIRECT_SUCCESS','/api/mealCheckout/directPay','U1',$pay,200,'支付成功'],['DIRECT_REPEAT','/api/mealCheckout/directPay','U1',$pay,500,'支付中，请勿重复支付'],['DIRECT_INSUFFICIENT','/api/mealCheckout/directPay','U1',['restaurant_id'=>$ids['STORE_R1'],'money'=>'2.00','remark'=>'CDXCORE11S1_DIRECT'],8001,'余额不足，请充值后再尝试！']
] as [$label,$path,$actor,$body,$status,$message])$cases[$label]=['label'=>$label,'path'=>$path,'actor'=>$actor,'body'=>$body,'body_raw'=>json_encode($body,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES),'expected_status'=>$status,'expected_message'=>$message];saveOnce('cases-C-resume.json',$cases);saveOnce('run-C-resume-attempt.json',['lane'=>$lane,'at'=>date('c'),'budget_HTTP'=>8,'budget_business_INSERT'=>4,'budget_business_UPDATE'=>4,'success_never_replayed'=>true]);$port=$lane==='B'?18941:18942;$results=[];$directClientStart=0;
try{foreach($cases as $label=>$case){if($label==='DIRECT_REPEAT'&&microtime(true)-$directClientStart>=4.5){$results[$label]=['NOT_RUN'=>'Conservative 5-second repeat window missed; successful payment body not replayed'];continue;}if($label==='DIRECT_INSUFFICIENT'){while(microtime(true)-$directClientStart<6.0)usleep(100000);}ck(!file_exists($runtime.'/client-attempt-'.$label.'.json'),'Client request once');$headers='Host: core.scan-pay.invalid' . "\r\n".'platform: POC'."\r\n".'Content-Type: application/json'."\r\n".'Access-Token: '.$tokens[$case['actor']]."\r\n".'X-Core-Case: '.$label."\r\n";saveOnce('client-attempt-'.$label.'.json',['method'=>'POST','url'=>'http://127.0.0.1:'.$port.$case['path'],'host'=>'core.scan-pay.invalid','platform'=>'POC','access_token_sha256'=>hash('sha256',$tokens[$case['actor']]),'body_raw'=>$case['body_raw'],'at'=>microtime(true)]);$started=microtime(true);if($label==='DIRECT_SUCCESS')$directClientStart=$started;$raw=file_get_contents('http://127.0.0.1:'.$port.$case['path'],false,stream_context_create(['http'=>['method'=>'POST','header'=>$headers,'content'=>$case['body_raw'],'ignore_errors'=>true,'timeout'=>45]]));$finished=microtime(true);$status=isset($http_response_header[0])&&preg_match('/HTTP\/\S+\s+(\d+)/',$http_response_header[0],$m)?(int)$m[1]:0;$json=is_string($raw)?json_decode($raw,true):null;$result=['label'=>$label,'http_status'=>$status,'body_raw'=>$raw,'headers_raw'=>$http_response_header,'started_microtime'=>$started,'finished_microtime'=>$finished,'duration_seconds'=>$finished-$started];event('client-results.jsonl',$result);$results[$label]=$result;ck($status===200&&is_array($json),'Actual original JSON response');if($label==='DIRECT_REPEAT'&&isset($json['harness_repeat_window_missed'])){$results[$label]['NOT_RUN']='Worker conservative repeat window missed before original Service';continue;}ck(($json['status']??null)===$case['expected_status']&&($json['message']??null)===$case['expected_message'],'Original complete business status/message '.$label);ck(file_exists($runtime.'/wire-'.$label.'.json'),'Physical fullrow/native/source wire evidence');}saveOnce('run-C-resume-complete.json',['lane'=>$lane,'results'=>$results,'finished_at'=>date('c'),'business_success_replayed'=>false]);echo json_encode(['lane'=>$lane,'actual_HTTP'=>count(array_filter($results,static function($r){return isset($r['http_status']);})),'completed'=>true]),"\n";}catch(Throwable $e){saveOnce('run-C-resume-failed.json',['lane'=>$lane,'class'=>get_class($e),'message'=>$e->getMessage(),'results'=>$results,'at'=>date('c')]);throw $e;}
