<?php
declare(strict_types=1);date_default_timezone_set('Asia/Shanghai');require __DIR__.'/oracle.php';require __DIR__.'/cases.php';
set_exception_handler(static function(Throwable $error):void{smSave('prepare-fatal-private.json',['class'=>get_class($error),'message'=>$error->getMessage()]);echo json_encode(['status'=>'prepare-tool-error','class'=>get_class($error),'message_sha256'=>hash('sha256',$error->getMessage())]),PHP_EOL;exit(1);});
$db=smPdo();$sha=catSha();catActor($db);$runtime=getenv('SM7_RUNTIME');if(is_file($runtime.'/prepared-private.json')){throw new RuntimeException('No prepared first-request replay');}
define('APP_PATH',getenv('SM7_ROOT').'/application/');require APP_PATH.'base/Security.php';$boundary=json_decode(file_get_contents(getenv('SM7_BASE').'/__poc_boundary'),true,512,JSON_THROW_ON_ERROR);
foreach(['private_source_reflection','effective_local_or_dm_config_verified','legacy_ai_fallback_disabled','file_cache','redis_disabled','external_stubs'] as $key){if(empty($boundary[$key])){throw new RuntimeException('Private boundary failed');}}if($boundary['real_queue']!==false||$boundary['json_encode_param']!==JSON_UNESCAPED_UNICODE){throw new RuntimeException('Private boundary options');}
$actor=smLoad('actor-private.json');$token=\app\base\Security::encrypt(implode("\t",[(string)$actor['id'],$actor['uuid'],$actor['marker'],'0','','',$actor['marker']]));$items=[];$spec=[];$errors=[];
foreach(n7Cases(smLoad('candidates-private.json')['candidates']) as $index=>$case){try{
 $proof=n7Snapshot($db,$case);$body=[];foreach($case['params'] as $key=>$value){$body[]=['key'=>$key,'value'=>(string)$value,'type'=>'text'];}
 $request=['method'=>'POST','url'=>getenv('SM7_BASE').$case['path'],'header'=>[['key'=>'token','value'=>$token],['key'=>'Content-Type','value'=>'application/x-www-form-urlencoded'],['key'=>'X-Pilot-Scenario','value'=>'PILOT_CAT7_'.$case['name']]],'body'=>['mode'=>'urlencoded','urlencoded'=>$body]];
 $expected=json_encode($proof['body'],JSON_UNESCAPED_UNICODE|JSON_THROW_ON_ERROR);$items[]=['id'=>'catalog7-'.$index,'name'=>$case['name'],'type'=>'http','metaInfo'=>['type'=>'HTTP'],'request'=>$request,'event'=>[['listen'=>'test','script'=>['type'=>'text/javascript','exec'=>["pm.test('HTTP 200',()=>pm.response.to.have.status(200));",'const expected='.$expected.';',"pm.test('independent original-table complete JSON contract',()=>pm.expect(pm.response.json()).to.deep.equal(expected));"]]]]];$spec[]=$case+['before'=>$proof];
 }catch(Throwable $error){$errors[$case['name']]=['class'=>get_class($error),'message_sha256'=>hash('sha256',$error->getMessage())];smSave('prepare-error-'.$case['name'].'-private.json',['message'=>$error->getMessage()]);}
}
smSave('spec-private.json',$spec);smSave('boundary-private.json',$boundary);smSave('collection-private.json',['apifoxCli'=>'2.2.8','info'=>['name'=>'Frozen catalog card restaurant readonly'],'item'=>[['name'=>'First four methods; remaining three separately gated','item'=>$items]]]);smSave('prepared-private.json',['lane'=>getenv('SM7_LANE'),'source_sha256'=>$sha,'prepared_cases'=>count($spec),'errors'=>$errors,'new_fixture_dml'=>0,'ddl'=>0]);echo json_encode(['lane'=>getenv('SM7_LANE'),'prepared_cases'=>count($spec),'skipped_cases'=>array_keys($errors),'new_fixture_dml'=>0,'ddl'=>0]),PHP_EOL;
