<?php
declare(strict_types=1);
require __DIR__.'/db.php';
$journal=[];
$q=static function(string $sql,array $args=[])use($db,$check,&$journal):array {
 $check(preg_match('/^SELECT\b/i',$sql)===1,'Read-only preflight');
 $s=$db->prepare($sql); $n=count($journal); $journal[$n]=['queryString'=>$s->queryString,'execute_parameters'=>$args];
 $s->execute($args);$rows=[];while($row=$s->fetch(PDO::FETCH_ASSOC)){$row=array_change_key_case($row,CASE_LOWER);foreach($row as &$v){if(is_resource($v))$v=stream_get_contents($v);$check(!is_string($v)||strlen($v)<=262144,'Field cap');}unset($v);$rows[]=$row;$check(count($rows)<=100,'Rows cap');}
 $journal[$n]['row_count']=count($rows);return $rows;
};
$report=['lane'=>$lane,'HTTP'=>0,'DML'=>0,'DDL'=>0,'passed'=>false];
try {
 if($lane==='B')$check(strpos($db->query('SELECT VERSION()')->fetchColumn(),'5.6.')===0,'MySQL5.6');
 else $check($db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()==='ZHCT_APP','DM schema');
 foreach(['nutrition_set','nutrition_time'] as $table) {
   $name=$p.$table;
   $cols=$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',[strtoupper($name)]);
   $constraints=$lane==='B'?$q('SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',[$name]):$q('SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME=?',[strtoupper($name)]);
   $triggers=$lane==='B'?$q('SELECT TRIGGER_NAME,EVENT_MANIPULATION,ACTION_TIMING,ACTION_STATEMENT FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$name]):$q('SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=?',[strtoupper($name)]);
   $total=(int)$q('SELECT COUNT(*) AS CNT FROM '.$name)[0]['cnt'];
   $where=$table==='nutrition_set'?'IS_DEL=1':'DEL_FLAG=0';
   $visible=(int)$q('SELECT COUNT(*) AS CNT FROM '.$name.' WHERE '.$where)[0]['cnt'];
   $report['tables'][$table]=['columns'=>$cols,'constraints'=>$constraints,'triggers'=>$triggers,'total'=>$total,'visible'=>$visible];
   if($lane==='B'){
    $report['tables'][$table]['keys']=$q('SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',[$name]);
    $report['tables'][$table]['indexes']=$q('SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY INDEX_NAME,SEQ_IN_INDEX',[$name]);
   } else {
    $report['tables'][$table]['keys']=$q('SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME=? ORDER BY CONSTRAINT_NAME,POSITION',[strtoupper($name)]);
    $report['tables'][$table]['indexes']=$q('SELECT * FROM USER_INDEXES WHERE TABLE_NAME=? ORDER BY INDEX_NAME',[strtoupper($name)]);
    $report['tables'][$table]['DDL']=$q("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'ZHCT_APP') AS DDL FROM DUAL",[strtoupper($name)]);
   }
   $check($total<=100,'Full table cap100 '.$table);
   $rows=$q('SELECT * FROM '.$name.' ORDER BY ID');
   $save('private-'.$table.'-rows.json',$rows);
   $report['tables'][$table]['source_sha256']=hash('sha256',json_encode($rows,JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION));
   $report['tables'][$table]['nonempty']=$total>0;
 }
 $report['nutrition_count']=(int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'nutrition')[0]['cnt'];
 require __DIR__.'/init.php';
 $GLOBALS['CDX_PREPARED']=[];
 new \app\p\logic\Nutrition(); new \app\p\logic\NutritionTime(); new \app\validate\Nutrition(); new \app\validate\NutritionTime();
 $report['constructor_SQL']=$GLOBALS['CDX_PREPARED'];
 $check($report['constructor_SQL']===[],'Target constructor0SQL');
 $report['passed']=true;
} catch(Throwable $e) { $save('private-preflight-error.json',['class'=>get_class($e),'message'=>$e->getMessage()]); $report['failure']=['class'=>get_class($e),'reason_sha256'=>hash('sha256',$e->getMessage())]; }
$save('private-preflight.json',$report);
$save('private-native-select-journal.json',$journal);
$public=$report; if(isset($public['tables']))foreach($public['tables'] as &$table){unset($table['columns'],$table['constraints'],$table['triggers'],$table['keys'],$table['indexes'],$table['DDL']);}unset($table);
echo json_encode($public,JSON_UNESCAPED_UNICODE),"\n"; exit($report['passed']?0:2);
