<?php
declare(strict_types=1);
$lane=getenv('READ12_LANE');$dm=getenv('POC_DIALECT')==='dm';
$runtime=__DIR__.'/private';if(!is_dir($runtime))mkdir($runtime,0700);chmod($runtime,0700);
$dsn=$dm?'dm:host=127.0.0.1;port=5238;schema=AIZHCT_APP':'mysql:host='.getenv('POC_AI_HOST').';port='.getenv('POC_AI_PORT').';dbname='.getenv('POC_AI_SCHEMA').';charset='.getenv('POC_AI_CHARSET');
$db=new PDO($dsn,getenv('POC_AI_USER'),getenv('POC_AI_PASSWORD'),[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER]);
$records=[];
$q=static function(string $sql,array $bind=[])use($db,&$records){
 if(!preg_match('/^SELECT\b/i',$sql)||preg_match('/;|\b(?:INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|INTO|CALL|FOR\s+UPDATE)\b/i',$sql))throw new RuntimeException('Preflight SELECT only');
 $s=$db->prepare($sql);$s->execute($bind);$rows=$s->fetchAll(PDO::FETCH_ASSOC);foreach($rows as &$r)foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($r,$v);
 $records[]=['queryString'=>$s->queryString,'execute_array'=>$bind,'binding_mode'=>'PDO execute array','rowCount'=>$s->rowCount(),'rows'=>$rows];return $rows;
};
$identity=$dm?$q("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') current_schema FROM DUAL"):array_merge($q('SELECT DATABASE() current_database'),$q('SELECT VERSION() version'));
if($dm?($identity[0]['current_schema']!=='AIZHCT_APP'):($identity[0]['current_database']!==getenv('POC_AI_SCHEMA')||strpos($identity[1]['version'],'5.6.')!==0))throw new RuntimeException('Actual approved identity drift');
$stage=getenv('READ12_STAGE')?:'1';
$tables=['staff','nutrition_meals','nutrition_lack','nurtrition','config_enum','user','user_points_log','store_user'];
if($stage==='2')$tables=array_merge($tables,['staff_store_user','staff_face','nation','sport']);
$schema=[];
foreach($tables as $name){$t='yoshop_'.$name;$u=strtoupper($t);
 $cols=$dm?$q('SELECT COLUMN_NAME,DATA_TYPE,NULLABLE,DATA_DEFAULT,DATA_LENGTH,DATA_PRECISION,DATA_SCALE FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[$u]):$q('SELECT COLUMN_NAME,DATA_TYPE,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$t]);
 $fk=$dm?$q("SELECT COUNT(*) n FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE='R' AND (TABLE_NAME=? OR R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME=?))",[$u,$u]):$q('SELECT COUNT(*) n FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND (TABLE_NAME=? OR REFERENCED_TABLE_NAME=?)',[$t,$t]);
 $tr=$dm?$q('SELECT COUNT(*) n FROM USER_TRIGGERS WHERE TABLE_NAME=?',[$u]):$q('SELECT COUNT(*) n FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$t]);
 $schema[$name]=['columns'=>$cols,'FK'=>(int)$fk[0]['n'],'triggers'=>(int)$tr[0]['n']];
 if($stage==='2'){
  $schema[$name]['indexes']=$dm?$q("SELECT c.CONSTRAINT_NAME,c.CONSTRAINT_TYPE,cc.COLUMN_NAME,cc.POSITION FROM USER_CONSTRAINTS c JOIN USER_CONS_COLUMNS cc ON c.CONSTRAINT_NAME=cc.CONSTRAINT_NAME WHERE c.TABLE_NAME=? AND c.CONSTRAINT_TYPE IN ('P','U') ORDER BY c.CONSTRAINT_NAME,cc.POSITION",[$u]):$q('SELECT INDEX_NAME,NON_UNIQUE,COLUMN_NAME,SEQ_IN_INDEX FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY INDEX_NAME,SEQ_IN_INDEX',[$t]);
  if($dm)$schema[$name]['ddl']=$q("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'AIZHCT_APP') ddl FROM DUAL",[$u]);
 }
}
$staff=$q('SELECT id,user_id,store_id,name,create_by,is_delete FROM yoshop_staff WHERE store_id=? AND name=? AND create_by=?',[2147000921,'CDXWT10C9D3_STAFF','CDXWT10C9D3']);
$operator=$q('SELECT store_user_id,store_id,user_name,is_super,is_delete FROM yoshop_store_user WHERE store_id IN (2147000921,2147001111,2147001112) ORDER BY store_id,store_user_id');
$activeUsers=$q('SELECT user_id,store_id,nick_name,is_delete FROM yoshop_user WHERE store_id IN (2147001111,2147001112) AND nick_name LIKE ? ORDER BY store_id,user_id',['CDXLF11F86A_%']);
$own=[];
if(count($staff)===1){$sid=(int)$staff[0]['id'];foreach(['nutrition_meals','nutrition_lack','nurtrition'] as $name){if(!$schema[$name]['columns']){$own[$name]=['missing_schema'=>true];continue;}$own[$name]=$q('SELECT * FROM yoshop_'.$name.' WHERE store_id=? AND staff_id=? ORDER BY id',[2147000921,$sid]);}}
$enumCounts=$q('SELECT enum_type,COUNT(*) n FROM yoshop_config_enum WHERE enum_type IN (6,7,8,9,10,11) AND is_delete=0 GROUP BY enum_type ORDER BY enum_type');
$points=[];foreach($activeUsers as $u)$points[]=['user'=>$u,'rows'=>$q('SELECT * FROM yoshop_user_points_log WHERE store_id=? AND user_id=? ORDER BY log_id',[(int)$u['store_id'],(int)$u['user_id']])];
$port=$lane==='B'?18881:18882;$s=@fsockopen('127.0.0.1',$port,$errno,$errstr,1);$collision=$s!==false;if($s)fclose($s);
$raw=['lane'=>$lane,'identity_verified'=>true,'schema'=>$schema,'marked_staff'=>$staff,'marked_operator'=>$operator,'active_users'=>$activeUsers,'own_nutrition'=>$own,'enum_counts'=>$enumCounts,'points'=>$points,'port'=>$port,'collision'=>$collision,'HTTP'=>0,'DML'=>0,'DDL'=>0,'queries'=>$records];
if($stage==='2'){
 $raw['enum_dictionary']=$q('SELECT * FROM yoshop_config_enum WHERE enum_type IN (6,7,8,9,10,11) AND is_delete=0 ORDER BY enum_type,'.($dm?'"ORDER"':'`order`'));
}
$raw['queries']=$records;
$json=json_encode($raw,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRESERVE_ZERO_FRACTION);if($json===false)throw new RuntimeException('Preserve encoding failure before further actions');
file_put_contents($runtime.'/preflight-stage'.$stage.'-'.$lane.'.json',$json);chmod($runtime.'/preflight-stage'.$stage.'-'.$lane.'.json',0600);
$out=['lane'=>$lane,'identity_verified'=>true,'schema_column_counts'=>array_map(static function($s){return count($s['columns']);},$schema),'marked_staff_count'=>count($staff),'marked_operator_count'=>count($operator),'active_user_count'=>count($activeUsers),'enum_counts'=>$enumCounts,'own_nutrition_counts'=>array_map('count',$own),'points_counts'=>array_map(static function($r){return count($r['rows']);},$points),'collision_zero'=>!$collision,'SELECT'=>count($records),'HTTP'=>0,'DML'=>0,'DDL'=>0,'raw_sha256'=>hash('sha256',$json)];
file_put_contents(__DIR__.'/preflight-stage'.$stage.'-'.$lane.'.json',json_encode($out,JSON_PRETTY_PRINT));echo json_encode($out),"\n";
