<?php
require __DIR__.'/db.php';$report=['lane'=>$lane,'HTTP'=>0,'DML'=>0,'DDL'=>0];
try{if($lane==='B')$check(strpos($q('SELECT VERSION() AS V')[0]['v'],'5.6.')===0,'MySQL5.6');else $check($q("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') AS S FROM DUAL")[0]['s']==='ZHCT_APP','DM schema');
 foreach(['nutrition_template','nutrition_template_ext','nutrition_station','nutrition_station_ext','annex','sport'] as $t){$table=$p.$t;$name=$lane==='B'?$table:strtoupper($table);$meta=$lane==='B'?$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,EXTRA,COLUMN_KEY,CHARACTER_MAXIMUM_LENGTH,DATETIME_PRECISION FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$name]):$q('SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[$name]);$check(count($meta)>0,'Registered table metadata '.$t);$count=(int)$q('SELECT COUNT(*) AS CNT FROM '.$table)[0]['cnt'];$report['tables'][$t]=['columns'=>$meta,'count'=>$count];
  if(in_array($t,['nutrition_template','nutrition_template_ext','nutrition_station','nutrition_station_ext'],true)){$report['tables'][$t]['constraints']=$lane==='B'?$q('SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',[$name]):$q('SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME=?',[$name]);$report['tables'][$t]['keys']=$lane==='B'?$q('SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',[$name]):$q('SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME=?',[$name]);$report['tables'][$t]['triggers']=$lane==='B'?$q('SELECT * FROM information_schema.TRIGGERS WHERE EVENT_OBJECT_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$name]):$q('SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=?',[$name]);if($lane==='C')$report['tables'][$t]['table_DDL']=$q("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'ZHCT_APP') AS DDL FROM DUAL",[$name]);}
  if($t==='sport'){$roots=(int)$q('SELECT COUNT(*) AS CNT FROM '.$table.' WHERE PUUID=?',['0'])[0]['cnt'];$report['sport_root_count']=$roots;$check($roots<=100,'Sport roots cap100');$save('private-sport-roots.json',$q('SELECT UUID,PUUID,NAME FROM '.$table.' WHERE PUUID=?',['0']));}
  elseif($t==='annex'){}
  else{$check($count<=100,'Full dictionary source cap100 '.$t);$save('private-'.$t.'-rows.json',$q('SELECT * FROM '.$table.' ORDER BY ID'));}
 }
 $stations=json_decode(file_get_contents(__DIR__.'/private-nutrition_station-rows.json'),true);$report['station_samples']=[];foreach(array_slice($stations,0,3) as $s){$uuid=$s['uuid'];$count=(int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'annex WHERE MASTER_UUID=?',[$uuid])[0]['cnt'];$report['station_samples'][]=['uuid'=>$uuid,'annex_count'=>$count];$check($count<=100,'Scoped annex cap');$save('private-annex-'.$s['id'].'-rows.json',$q('SELECT * FROM '.$p.'annex WHERE MASTER_UUID=?',[$uuid]));}
 $uuid=$lane==='B'?'6969DC3F-CC71-237D-FCED-389B86C5905F':'711DB31A-5BF6-4478-BB9E-C866F0C88DA3';$rows=$q('SELECT * FROM '.$p.'nutrition WHERE UUID=?',[$uuid]);$check(count($rows)===1,'Prior approved local product');$save('private-product-row.json',$rows);$save('private-set-rows.json',$q('SELECT * FROM '.$p.'nutrition_set ORDER BY ID'));$save('private-time-rows.json',$q('SELECT * FROM '.$p.'nutrition_time ORDER BY ID'));
 require __DIR__.'/init.php';$GLOBALS['CDX_PREPARED']=[];new \app\p\logic\NutritionTemplate();new \app\p\logic\NutritionStation();new \app\m\logic\Nutrition();new \app\p\logic\Nutrition();new \app\validate\NutritionTemplate();new \app\validate\NutritionStation();$report['constructor_SQL']=$GLOBALS['CDX_PREPARED'];$check($GLOBALS['CDX_PREPARED']===[],'Target constructor0SQL');$report['train_status_config']=\think\Config::get('train_status');$report['passed']=true;
}catch(Throwable $e){$save('private-preflight-error.json',['class'=>get_class($e),'message'=>$e->getMessage(),'trace'=>$e->getTraceAsString()]);$report['failure']=['class'=>get_class($e),'reason_sha256'=>hash('sha256',$e->getMessage())];}
$save('private-preflight.json',$report);$save('private-select-journal.json',$GLOBALS['ORACLE_JOURNAL']);$summary=$report;foreach($summary['tables']??[] as $key=>$value)$summary['tables'][$key]=['count'=>$value['count']];unset($summary['station_samples'],$summary['train_status_config']);echo json_encode($summary),"\n";exit(!empty($report['passed'])?0:2);
