<?php

declare(strict_types=1);

$lane=(string)getenv('CDX_DMT_LANE');$mode=(string)($argv[1]??'');$self=(string)hash_file('sha256',__FILE__);
if(!in_array($lane,['B','C'],true)||count($argv)!==2||!in_array($mode,['--preflight','--execute','--audit'],true)
    ||($mode==='--execute'&&((string)getenv('CDX_DMT_APPROVE')!=='ROOT_TARGET_CHAIN_V1'||!hash_equals($self,(string)getenv('CDX_DMT_SHA'))))){echo json_encode(['status'=>'default_deny','connected'=>false,'http_sent'=>false,'dml'=>false]),PHP_EOL;exit(78);}
$stage='bootstrap';set_exception_handler(static function(Throwable$e)use(&$stage):void{echo json_encode(['status'=>'redacted_stop','stage'=>$stage,'class'=>get_class($e),'code'=>(string)$e->getCode(),'message_sha'=>hash('sha256',$e->getMessage()),'recovery'=>'inspect_private_journal_if_present']),PHP_EOL;exit(2);});
[$root,$pid,$port,$dialect]=['B'=>['/tmp/zhct-http-store-mysql.dQTTBP',10001,18081,'mysql'],'C'=>['/tmp/zhct-dm-poc-20260928.fcpiiN/store',112175,18080,'dm']][$lane];
$hashes=['/application/p/controller/DateMenu.php'=>'792b56de2dc42d36e19fc1d0f852cd853dab8f7768c06276070d02a9bfc76013','/application/p/logic/DateMenu.php'=>'42d6ff7b5c65b423590c6a2ed234aaed83ef7e48ccda3186323566890c6a4db4','/application/model/MenuRecommend.php'=>'93cd644f5ac965702165fd206b788d3d381e18edb3d6904c94851a7b8611af6c','/application/model/Staff.php'=>'e709b91af8e78758b0adbb29697dba4d16d62402d8c365712afe9c47e72277d3'];
if(PHP_VERSION_ID<70300||PHP_VERSION_ID>=70400||is_link($root))throw new RuntimeException('Runtime/root drift');foreach($hashes as$path=>$sha)if(!is_file($root.$path)||hash_file('sha256',$root.$path)!==$sha)throw new RuntimeException('Business source drift');
$stage='http_boundary';$base='http://127.0.0.1:'.$port;$cmd=(string)@file_get_contents('/proc/'.$pid.'/cmdline');$childrenPath='/proc/'.$pid.'/task/'.$pid.'/children';$boundary=json_decode((string)@file_get_contents($base.'/__poc_boundary'),true);if(strpos($cmd,$root.'/public')===false||strpos($cmd,'127.0.0.1:'.$port)===false||trim((string)@file_get_contents($childrenPath))!==''||!is_array($boundary)||($boundary['external_stubs']??null)!==true||($boundary['redis_isolated']??null)!==true||($boundary['real_queue']??true)!==false)throw new RuntimeException('HTTP boundary drift');
$stage='database_boundary';$runtime=require $root.'/application/database.php';if($dialect==='mysql'){$local=require '/workspace/zhct/zhctproject/store/application/config/local/database.php';foreach(['hostname','database','username','password']as$key)if(($runtime[$key]??null)!==($local[$key]??null))throw new RuntimeException('Not local MySQL');if((int)($runtime['hostport']??3306)!==(int)($local['hostport']??3306))throw new RuntimeException('Port drift');$dsn='mysql:host='.$runtime['hostname'].';port='.(int)($runtime['hostport']??3306).';dbname='.$runtime['database'].';charset='.(string)($runtime['charset']??'utf8');}else{foreach(['hostname'=>'POC_HOST','hostport'=>'POC_PORT','database'=>'POC_SCHEMA','username'=>'POC_USER','password'=>'POC_PASSWORD']as$key=>$env)if((string)($runtime[$key]??'')!==(string)getenv($env))throw new RuntimeException('C config drift');if((string)getenv('POC_HOST')!=='127.0.0.1'||(string)getenv('POC_PORT')!=='5237'||strtoupper((string)getenv('POC_SCHEMA'))!=='ZHCT_APP')throw new RuntimeException('Not approved DM');$dsn='dm:host=127.0.0.1;port=5237;schema=ZHCT_APP';}
$connect=static function()use($dsn,$runtime):PDO{return new PDO($dsn,(string)$runtime['username'],(string)$runtime['password'],[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER,PDO::ATTR_TIMEOUT=>5]);};$db=$connect();$identity=$dialect==='mysql'?(string)$db->query("SELECT CONCAT(@@server_uuid,'|',@@hostname,'|',@@port,'|',DATABASE())")->fetchColumn():'ZHCT_APP|5237|'.(string)$db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn();$approved=$dialect==='mysql'?'003eb5aecf1cd4595b609c1f7f20b9ee325b578309fb9fe14fedaf77584fa401':'bc98485aed26beab348770a82ae38dbf922b04ab88a210cd7282c4caf0156194';if(hash('sha256',$identity)!==$approved)throw new RuntimeException('DB identity drift');
$p=$dialect==='dm'?'YDY_':'ydy_';$tables=['user','staff','menu_recommend','menu_recommend_record','menu_recommend_set','rpe','rpe_info','date_menu','initial_menu_log','task'];$t=static function(string$n)use($p,$tables):string{if(!in_array($n,$tables,true))throw new RuntimeException('Unapproved table');return$p.$n;};$fetch=static function(PDO$p,string$sql,array$args=[]):array{$q=$p->prepare($sql);$q->execute($args);return$q->fetchAll(PDO::FETCH_ASSOC);};$count=static function(PDO$p,string$sql,array$args=[]):int{$q=$p->prepare($sql);$q->execute($args);return(int)$q->fetchColumn();};
$required=['user'=>['UUID','ACCOUNT','PWD','SALT','NAME','TYPE','STATUS','CREATE_TIME','CREATE_BY','IS_DELETE'],'staff'=>['UUID','STATION_UUID','NAME','BIRTHDAY','HEIGHT','WEIGHT','SPORT_UUID','SPORT_EVENT_UUID','IN_TIME','CREATE_TIME','CREATE_BY','PERSONNEL_UMBER','PERMANENT_ADDRESS','COACH_NAME','SPORT_YEAR','IS_SHOW','STATUS'],'menu_recommend'=>['UUID','STAFF_UUID','MENU_DATE','TOTAL_POWER','RECOMMEND_POWER','MORNING_POWER','NOON_POWER','NIGHT_POWER','CARBOHYDRATE_WEIGHT','PROTEIN_WEIGHT','FAT_WEIGHT','CARBOHYDRATE_RATIO','PROTEIN_RATIO','FAT_RATIO','CREATE_TIME']];$metadata=[];
foreach($required as$logical=>$columns){if($dialect==='mysql'){$q=$db->prepare('SELECT COLUMN_NAME,DATA_TYPE,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION');$q->execute([$t($logical)]);}else{$q=$db->prepare('SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM ALL_TAB_COLUMNS WHERE OWNER=? AND TABLE_NAME=? ORDER BY COLUMN_ID');$q->execute(['ZHCT_APP',$t($logical)]);}$rows=$q->fetchAll(PDO::FETCH_ASSOC);$names=[];foreach($rows as$row){$names[]=strtoupper((string)$row['column_name']);$metadata[]=[$logical,$row];}foreach($columns as$column)if(!in_array($column,$names,true))throw new RuntimeException('Required column absent');}
if($dialect==='mysql'){$names='?,?,?';$physical=[$t('user'),$t('staff'),$t('menu_recommend')];$q=$db->prepare('SELECT COUNT(*) FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE IN ('.$names.')');$q->execute($physical);$triggers=(int)$q->fetchColumn();$q=$db->prepare('SELECT COUNT(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA=DATABASE() AND (TABLE_NAME IN ('.$names.') OR REFERENCED_TABLE_NAME IN ('.$names.'))');$q->execute(array_merge($physical,$physical));$fks=(int)$q->fetchColumn();}else{$triggers=(int)$db->query("SELECT COUNT(*) FROM ALL_TRIGGERS WHERE OWNER='ZHCT_APP' AND TABLE_NAME IN ('YDY_USER','YDY_STAFF','YDY_MENU_RECOMMEND')")->fetchColumn();$fks=(int)$db->query("SELECT COUNT(*) FROM ALL_CONSTRAINTS WHERE OWNER='ZHCT_APP' AND CONSTRAINT_TYPE='R' AND TABLE_NAME IN ('YDY_USER','YDY_STAFF','YDY_MENU_RECOMMEND')")->fetchColumn();}if($triggers!==0||$fks!==0)throw new RuntimeException('Unreviewed trigger or FK');
$old=$count($db,'SELECT COUNT(*) FROM '.$t('user')." WHERE ACCOUNT LIKE 'CDXDMT%'")+$count($db,'SELECT COUNT(*) FROM '.$t('staff')." WHERE UUID LIKE 'CDXDMT%' OR CREATE_BY LIKE 'CDXDMT%'")+$count($db,'SELECT COUNT(*) FROM '.$t('menu_recommend')." WHERE UUID LIKE 'CDXDMT%' OR STAFF_UUID LIKE 'CDXDMT%'");
$journal=(string)getenv('CDX_DMT_JOURNAL');$prefixZero=static function(PDO$p)use($t,$count):int{return$count($p,'SELECT COUNT(*) FROM '.$t('user')." WHERE ACCOUNT LIKE 'CDXDMT%' OR UUID LIKE 'CDXDMT%'")+$count($p,'SELECT COUNT(*) FROM '.$t('staff')." WHERE UUID LIKE 'CDXDMT%' OR CREATE_BY LIKE 'CDXDMT%'")+$count($p,'SELECT COUNT(*) FROM '.$t('menu_recommend')." WHERE UUID LIKE 'CDXDMT%' OR STAFF_UUID LIKE 'CDXDMT%'");};
if($mode==='--audit'){$stage='audit';if(!preg_match('~^/tmp/cdx-dmt-[a-f0-9]{12}/recovery\.json$~D',$journal)||!is_file($journal)||is_link($journal)||is_link(dirname($journal))||(fileperms(dirname($journal))&0777)!==0700||(fileperms($journal)&0777)!==0600)throw new RuntimeException('Journal invalid');$saved=json_decode((string)file_get_contents($journal),true);if(!is_array($saved)||($saved['lane']??null)!==$lane||($saved['phase']??null)!=='fixture_deleted')throw new RuntimeException('Journal ownership invalid');$fresh=$connect();if($prefixZero($fresh)!==0)throw new RuntimeException('Fixture remains');foreach(['menu_recommend_record','menu_recommend_set','rpe','date_menu','initial_menu_log','task']as$logical)if($count($fresh,'SELECT COUNT(*) FROM '.$t($logical).' WHERE STAFF_UUID=?',[$saved['staff_uuid']])!==0)throw new RuntimeException('Unexpected staff reference remains');unlink($journal);rmdir(dirname($journal));echo json_encode(['status'=>'independent_zero_pass','lane'=>$lane,'marker_rows'=>0,'staff_references'=>0,'private_journal_removed'=>true]),PHP_EOL;exit(0);}
if($mode==='--preflight'){$ready=$old===0;echo json_encode(['status'=>$ready?'select_only_ready':'marker_stop','lane'=>$lane,'metadata_sha'=>hash('sha256',serialize($metadata)),'foreign_keys'=>$fks,'triggers'=>$triggers,'old_marker_rows'=>$old,'http_sent'=>false,'dml'=>false]),PHP_EOL;exit($ready?0:2);}if($old!==0)throw new RuntimeException('Old marker remains');
$marker='CDXDMT'.strtoupper(bin2hex(random_bytes(6)));$actorUuid=$marker.'U';$staffUuid=$marker.'S';$recommendUuid=$marker.'R';$date='2001-02-03';$dir='/tmp/cdx-dmt-'.strtolower(bin2hex(random_bytes(6)));if(file_exists($dir)||!mkdir($dir,0700))throw new RuntimeException('Private directory unavailable');chmod($dir,0700);$journal=$dir.'/recovery.json';$saved=['lane'=>$lane,'marker'=>$marker,'actor_uuid'=>$actorUuid,'actor_id'=>0,'staff_uuid'=>$staffUuid,'staff_id'=>0,'recommend_uuid'=>$recommendUuid,'recommend_id'=>0,'phase'=>'before_insert'];$save=static function()use(&$saved,$journal):void{if(file_put_contents($journal,json_encode($saved),LOCK_EX)===false||!chmod($journal,0600))throw new RuntimeException('Journal write failed');};$save();
$insert=static function(PDO$p,string$table,array$data):void{$cols=array_keys($data);$q=$p->prepare('INSERT INTO '.$table.' ('.implode(',',$cols).') VALUES ('.implode(',',array_fill(0,count($cols),'?')).')');$q->execute(array_values($data));if($q->rowCount()!==1)throw new RuntimeException('Insert mismatch');};$findId=static function(PDO$p,string$table,array$where):int{$parts=[];foreach(array_keys($where)as$k)$parts[]=$k.'=?';$q=$p->prepare('SELECT ID FROM '.$table.' WHERE '.implode(' AND ',$parts));$q->execute(array_values($where));$ids=$q->fetchAll(PDO::FETCH_COLUMN);if(count($ids)!==1||(int)$ids[0]<=0)throw new RuntimeException('Ownership ambiguous');return(int)$ids[0];};
$result=['status'=>'FAIL','lane'=>$lane,'cases'=>[]];$failure='';$uncertain=false;$fixture=false;
try{$stage='fixture_insert';$db->beginTransaction();$now=date('Y-m-d H:i:s');$insert($db,$t('user'),['UUID'=>$actorUuid,'ACCOUNT'=>$marker,'PWD'=>'DISABLED','SALT'=>strtoupper(bin2hex(random_bytes(8))),'NAME'=>$marker,'TYPE'=>0,'STATUS'=>0,'CREATE_TIME'=>$now,'CREATE_BY'=>$marker,'IS_DELETE'=>0]);$insert($db,$t('staff'),['UUID'=>$staffUuid,'STATION_UUID'=>'0','IS_ATHLETE'=>1,'GRADE'=>1,'NAME'=>$marker,'SEX'=>1,'BIRTHDAY'=>'2000-01-01','HEIGHT'=>0,'WEIGHT'=>'0.00','NATION'=>'测试','NATIVE_PLACE'=>'测试','IDENTITY_TYPE'=>1,'IDENTITY_NUMBER'=>$marker,'HEAD_IMG'=>$marker,'SPORT_UUID'=>'0','SPORT_EVENT_UUID'=>$marker,'IN_TIME'=>'2020-01-01','MOBILE'=>$marker,'EMAIL'=>'test@example.invalid','CREATE_TIME'=>$now,'CREATE_BY'=>$marker,'PERSONNEL_UMBER'=>substr($marker,-8),'IS_SHOW'=>0,'STATUS'=>0,'PERMANENT_ADDRESS'=>'测试地址','COACH_NAME'=>'测试教练','SPORT_YEAR'=>'1']);$insert($db,$t('menu_recommend'),['UUID'=>$recommendUuid,'STAFF_UUID'=>$staffUuid,'MENU_DATE'=>$date,'TOTAL_POWER'=>'2000.00','RECOMMEND_POWER'=>'2000.00','MORNING_POWER'=>'600.00','NOON_POWER'=>'800.00','NIGHT_POWER'=>'600.00','CARBOHYDRATE_WEIGHT'=>'250.00','PROTEIN_WEIGHT'=>'100.00','FAT_WEIGHT'=>'66.67','CARBOHYDRATE_RATIO'=>'0.50','PROTEIN_RATIO'=>'0.20','FAT_RATIO'=>'0.30','PRESCRIPTION_POWER'=>'0.00','PRESCRIPTION_CARBOHYDRATE'=>'0.00','PRESCRIPTION_PROTEIN'=>'0.00','PRESCRIPTION_FAT'=>'0.00','WEIGHT_STATUS'=>2,'CREATE_TIME'=>$now]);$saved['actor_id']=$findId($db,$t('user'),['UUID'=>$actorUuid,'ACCOUNT'=>$marker]);$saved['staff_id']=$findId($db,$t('staff'),['UUID'=>$staffUuid,'CREATE_BY'=>$marker]);$saved['recommend_id']=$findId($db,$t('menu_recommend'),['UUID'=>$recommendUuid,'STAFF_UUID'=>$staffUuid]);$db->commit();$fixture=true;$saved['phase']='fixture_committed';$save();
    $readRow=static function(PDO$p,string$sql,array$args):array{$q=$p->prepare($sql);$q->execute($args);$r=$q->fetch(PDO::FETCH_ASSOC);return is_array($r)?$r:[];};$before=$readRow($connect(),'SELECT * FROM '.$t('menu_recommend').' WHERE ID=? AND UUID=?',[$saved['recommend_id'],$recommendUuid]);if($before===[])throw new RuntimeException('Fixture readback failed');
    require_once $root.'/application/base/Security.php';$token=\app\base\Security::encrypt(implode("\t",[(string)$saved['actor_id'],$actorUuid,$marker,'0','','',$marker]));$send=static function(string$path,array$form,string$token='')use($base,&$uncertain):array{$headers="Content-Type: application/x-www-form-urlencoded\r\n".($token!==''?'token: '.$token."\r\n":'');$stream=@fopen($base.$path,'rb',false,stream_context_create(['http'=>['method'=>'POST','timeout'=>25,'ignore_errors'=>true,'header'=>$headers,'content'=>http_build_query($form,'','&',PHP_QUERY_RFC3986)]]));$raw=$stream===false?false:stream_get_contents($stream,1048577);$hs=$http_response_header??[];if(is_resource($stream))fclose($stream);preg_match('/HTTP\/\S+\s+(\d+)/',(string)($hs[0]??''),$m);$http=(int)($m[1]??0);if($stream===false||$raw===false||$http===0)$uncertain=true;return[$http,is_string($raw)?json_decode($raw,true):null];};$shape=static function($node)use(&$shape){if(!is_array($node))return gettype($node);if($node===[])return[];$keys=array_keys($node);if($keys===range(0,count($node)-1))return['[]'=>$shape($node[0])];$out=[];foreach($node as$k=>$v)$out[(string)$k]=$shape($v);ksort($out);return$out;};
    $edit=['uuid'=>$recommendUuid,'total_power'=>2100,'prescription_power'=>0,'prescription_carbohydrate'=>0,'prescription_protein'=>0,'prescription_fat'=>0];$saveForm=$edit;$target=['date'=>$date,'staff_uuid'=>$staffUuid];$paths=['editPower'=>['/p/dateMenu/editPower',$edit],'saveTarget'=>['/p/dateMenu/saveTarget',$saveForm],'getTarget'=>['/p/dateMenu/getTarget',$target]];foreach($paths as$name=>[$path,$form]){$stage='unauth_'.$name;[$http,$body]=$send($path,$form);if($http!==200||!is_array($body)||(int)($body['code']??0)===0)throw new RuntimeException('Unauth route not rejected');}
    $stage='http_editPower';[$http,$body]=$send($paths['editPower'][0],$edit,$token);$data=$body['data']??null;if($http!==200||(int)($body['code']??-1)!==0||!is_array($data)||(int)($data['total_power']??0)!==2100||(int)($data['carbohydrate_weight']??0)!==263||(int)($data['protein_weight']??0)!==105||(int)($data['fat_weight']??0)!==70)throw new RuntimeException('editPower mismatch');$afterEdit=$readRow($connect(),'SELECT * FROM '.$t('menu_recommend').' WHERE ID=?',[$saved['recommend_id']]);if(hash('sha256',serialize($afterEdit))!==hash('sha256',serialize($before)))throw new RuntimeException('editPower unexpectedly wrote');$result['cases']['editPower']=['source_match'=>true,'db_write'=>false,'key_sha'=>hash('sha256',serialize(array_keys($data))),'type_sha'=>hash('sha256',serialize($shape($data))),'selected_types'=>['total_power'=>gettype($data['total_power']??null),'carbohydrate_weight'=>gettype($data['carbohydrate_weight']??null),'protein_weight'=>gettype($data['protein_weight']??null),'fat_weight'=>gettype($data['fat_weight']??null),'add_meal'=>gettype($data['add_meal']??null)]];
    $stage='http_saveTarget';[$http,$body]=$send($paths['saveTarget'][0],$saveForm,$token);if($http!==200||(int)($body['code']??-1)!==0||($body['data']??null)!==[])throw new RuntimeException('saveTarget response mismatch');$afterSave=$readRow($connect(),'SELECT * FROM '.$t('menu_recommend').' WHERE ID=? AND UUID=? AND STAFF_UUID=?',[$saved['recommend_id'],$recommendUuid,$staffUuid]);if((int)$afterSave['total_power']!==2100||(int)$afterSave['recommend_power']!==2000||(int)$afterSave['carbohydrate_weight']!==263||(int)$afterSave['protein_weight']!==105||(int)$afterSave['fat_weight']!==70||(int)$afterSave['edit_flag']!==1)throw new RuntimeException('saveTarget DB mismatch');$result['cases']['saveTarget']=['source_match'=>true,'db_write'=>true,'affected_owned_row'=>1,'key_sha'=>hash('sha256',serialize(array_keys($body))),'type_sha'=>hash('sha256',serialize($shape($body))),'selected_types'=>['code'=>gettype($body['code']??null),'message'=>gettype($body['message']??null),'data'=>gettype($body['data']??null)]];
    $stage='http_getTarget';$beforeTarget=hash('sha256',serialize($afterSave));[$http,$body]=$send($paths['getTarget'][0],$target,$token);$data=$body['data']??null;
    $result['getTarget_observed']=['http'=>$http,'code'=>is_array($body)?($body['code']??null):null,'data_is_array'=>is_array($data),'uuid_match'=>is_array($data)&&rtrim((string)($data['uuid']??''))===$recommendUuid,'total_power'=>is_array($data)?($data['total_power']??null):null,'total_power_type'=>is_array($data)?gettype($data['total_power']??null):'missing','weight_status'=>is_array($data)?($data['weight_status']??null):null,'data_keys'=>is_array($data)?array_keys($data):[]];
    if($http!==200||(int)($body['code']??-1)!==0||!is_array($data)||rtrim((string)($data['uuid']??''))!==$recommendUuid||(int)($data['total_power']??0)!==2100||(string)($data['weight_status']??'')!=='保持')throw new RuntimeException('getTarget mismatch');unset($result['getTarget_observed']);$afterTarget=$readRow($connect(),'SELECT * FROM '.$t('menu_recommend').' WHERE ID=?',[$saved['recommend_id']]);if(hash('sha256',serialize($afterTarget))!==$beforeTarget)throw new RuntimeException('getTarget changed target row unexpectedly');
    $recordRows=$fetch($connect(),'SELECT * FROM '.$t('menu_recommend_record').' WHERE STAFF_UUID=? AND MENU_RECOMMEND_UUID=? ORDER BY ID',[$staffUuid,$recommendUuid]);if(count($recordRows)!==0)throw new RuntimeException('getTarget unexpectedly wrote record');
    $targetTypes=[];$targetValues=[];foreach($data as$targetKey=>$targetValue){$targetTypes[$targetKey]=gettype($targetValue);if($targetKey!=='uuid')$targetValues[$targetKey]=$targetValue;}ksort($targetTypes);ksort($targetValues);
    $result['cases']['getTarget']=['source_match'=>true,'db_write'=>false,'owned_record_rows'=>0,'key_sha'=>hash('sha256',serialize(array_keys($data))),'type_sha'=>hash('sha256',serialize($shape($data))),'selected_types'=>['target_types'=>$targetTypes,'target_values'=>$targetValues]];
    foreach(['menu_recommend_record','menu_recommend_set','rpe','date_menu','initial_menu_log','task']as$logical)if($count($connect(),'SELECT COUNT(*) FROM '.$t($logical).' WHERE STAFF_UUID=?',[$staffUuid])!==0)throw new RuntimeException('Unexpected write table');$result['status']='HTTP_PASS_PENDING_CLEANUP';
}catch(Throwable$e){if($db->inTransaction())$db->rollBack();$failure=get_class($e).':'.(string)$e->getCode().':'.hash('sha256',$e->getMessage());$result['failure_stage']=$stage;}
if(!$fixture){$saved['phase']='fixture_rolled_back';$save();unlink($journal);rmdir($dir);$result['failure']=$failure;$result['cleanup']='rollback_zero';echo json_encode($result,JSON_UNESCAPED_SLASHES),PHP_EOL;exit(2);}if($uncertain||!is_array(json_decode((string)@file_get_contents($base.'/__poc_boundary'),true))||trim((string)@file_get_contents($childrenPath))!==''){$saved['phase']='uncertain_http_retain_fixture';$save();echo json_encode(['status'=>'uncertain_http_retain_fixture','lane'=>$lane,'journal'=>$journal],JSON_UNESCAPED_SLASHES),PHP_EOL;exit(3);} $stage='reference_scan';
$scan=static function(PDO$p,string$column,string$value)use($dialect):array{if($dialect==='mysql'){$q=$p->prepare('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND COLUMN_NAME=? ORDER BY TABLE_NAME');$q->execute([strtolower($column)]);}else{$q=$p->prepare('SELECT TABLE_NAME FROM ALL_TAB_COLUMNS WHERE OWNER=? AND COLUMN_NAME=? ORDER BY TABLE_NAME');$q->execute(['ZHCT_APP',strtoupper($column)]);}$out=[];foreach($q->fetchAll(PDO::FETCH_COLUMN)as$table){if(!preg_match('/^YDY_[A-Z0-9_]+$/i',(string)$table))continue;$c=$p->prepare('SELECT COUNT(*) FROM '.$table.' WHERE '.strtoupper($column).'=?');$c->execute([$value]);$n=(int)$c->fetchColumn();if($n>0)$out[strtoupper((string)$table)]=$n;}ksort($out);return$out;};$refs=$scan($connect(),'STAFF_UUID',$staffUuid);$expected=['YDY_MENU_RECOMMEND'=>1];if($refs!==$expected){$saved['phase']='unexpected_reference_retain_fixture';$save();echo json_encode(['status'=>'unexpected_reference_retain_fixture','journal'=>$journal,'ref_sha'=>hash('sha256',serialize($refs))]),PHP_EOL;exit(4);} $stage='cleanup';$clean=$connect();$clean->beginTransaction();$del=static function(PDO$p,string$sql,array$args,int$n):void{$q=$p->prepare($sql);$q->execute($args);if($q->rowCount()!==$n)throw new RuntimeException('Cleanup mismatch');};try{$del($clean,'DELETE FROM '.$t('menu_recommend').' WHERE ID=? AND UUID=? AND STAFF_UUID=?',[$saved['recommend_id'],$recommendUuid,$staffUuid],1);$del($clean,'DELETE FROM '.$t('staff').' WHERE ID=? AND UUID=? AND CREATE_BY=?',[$saved['staff_id'],$staffUuid,$marker],1);$del($clean,'DELETE FROM '.$t('user').' WHERE ID=? AND UUID=? AND ACCOUNT=? AND TYPE=0 AND CREATE_BY=?',[$saved['actor_id'],$actorUuid,$marker,$marker],1);$clean->commit();}catch(Throwable$e){if($clean->inTransaction())$clean->rollBack();$saved['phase']='cleanup_failed';$save();throw$e;}$saved['phase']='fixture_deleted';$save();if($prefixZero($connect())!==0)throw new RuntimeException('Marker remains');$result['cleanup']=['marker_rows'=>0,'references_before'=>$refs,'journal'=>$journal];if($failure!==''){$result['status']='HTTP_FAIL_CLEANED';$result['failure']=$failure;}else$result['status']='HTTP_PASS_CLEANED_PENDING_AUDIT';echo json_encode($result,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES),PHP_EOL;exit($failure===''?0:2);
