<?php
declare(strict_types=1);
$lane=$argv[1]??'';$root=$lane==='B'?'/tmp/zhct-http-store-mysql.dQTTBP':'/tmp/zhct-dm-poc-20260928.fcpiiN/store';
if(!in_array($lane,['B','C'],true))exit(78);
defined('TP_ENV')||define('TP_ENV','local');defined('BUSINESS')||define('BUSINESS','');
defined('APP_PATH')||define('APP_PATH',$lane==='B'?'/workspace/zhct/zhctproject/store/application/':$root.'/application/');
$cfg=(static function($f){return require $f;})($lane==='B'?'/workspace/zhct/zhctproject/store/application/database.php':$root.'/application/database.php');
if($lane==='B'){$local=(static function($f){return require $f;})('/workspace/zhct/zhctproject/store/application/config/local/database.php');foreach(['hostname','database','username','password']as $k)if($cfg[$k]!==$local[$k])throw new RuntimeException('Not code local');if($cfg['charset']!=='utf8'||(string)($cfg['hostport']?:3306)!=='3306'||!empty($cfg['params']))throw new RuntimeException('Source configuration drift');}
elseif($cfg['hostname']!=='127.0.0.1'||(string)$cfg['hostport']!=='5237'||$cfg['database']!=='ZHCT_APP')throw new RuntimeException('DM scope');
$dsn=$lane==='B'?'mysql:host='.$cfg['hostname'].';port=3306;dbname='.$cfg['database'].';charset=utf8':'dm:host=127.0.0.1;port=5237;schema=ZHCT_APP';
$db=new PDO($dsn,$cfg['username'],$cfg['password'],[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER,PDO::ATTR_STRINGIFY_FETCHES=>false,PDO::ATTR_EMULATE_PREPARES=>false]);
$journal=[];$q=static function($sql,$args=[])use($db,&$journal){if(!preg_match('/^SELECT\b/',$sql)||strpos($sql,';')!==false)throw new RuntimeException('Read only');$s=$db->prepare($sql);foreach($args as $i=>$v)$s->bindValue($i+1,$v,is_int($v)?1:2);$s->execute();$rows=[];while($r=$s->fetch(PDO::FETCH_ASSOC)){$r=array_change_key_case($r,CASE_LOWER);foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($v);$rows[]=$r;if(count($rows)>100)throw new RuntimeException('Bounded result');}$journal[]=['sql'=>$s->queryString,'binds'=>$args,'rows'=>$rows,'rowCount'=>$s->rowCount()];return $rows;};
$r=['lane'=>$lane,'business_DML'=>0,'DDL'=>0,'HTTP'=>0];
foreach(['nutrition','nutrition_template','nutrition_template_ext','nutrition_set','nutrition_category','nutrition_time']as $t){$table='ydy_'.$t;$r['metadata'][$t]=$lane==='B'?$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,EXTRA,COLUMN_KEY FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$table]):$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($table)]);$r['constraints'][$t]=$lane==='B'?$q('SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',[$table]):$q('SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME=?',[strtoupper($table)]);$r['triggers'][$t]=$lane==='B'?$q('SELECT TRIGGER_NAME,ACTION_TIMING,EVENT_MANIPULATION,ACTION_STATEMENT FROM information_schema.TRIGGERS WHERE EVENT_OBJECT_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$table]):$q('SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=?',[strtoupper($table)]);}
$r['actor']=$q('SELECT id,uuid,account,name,type,status,is_delete,user_type,staff_uuid FROM ydy_user WHERE id=? AND account LIKE ?',[$lane==='B'?97260:2791,'CDX%']);
if(count($r['actor'])!==1)throw new RuntimeException('Exact marked actor');
foreach(['nutrition','nutrition_template','nutrition_set','nutrition_category','nutrition_time']as $t)$r['marked'][$t]=$q('SELECT * FROM ydy_'.$t.' WHERE name LIKE ? ORDER BY id',['CDX%']);
$r['collision']=$q('SELECT id,uuid,name FROM ydy_nutrition WHERE name LIKE ?',['CDXNF11F5%']);
$r['template_collision']=$q('SELECT id,uuid,name FROM ydy_nutrition_template WHERE name LIKE ?',['CDXNF11F5%']);
foreach([18921,18922]as $port){$s=@fsockopen('127.0.0.1',$port,$n,$e,0.5);$r['ports'][(string)$port]=$s!==false;if($s)fclose($s);}
$r['source_mode']=$lane==='B'?$q('SELECT @@session.sql_mode AS sql_mode,@@character_set_connection AS charset,VERSION() AS version'):[];
$r['journal']=$journal;if(!is_dir(__DIR__.'/private'))mkdir(__DIR__.'/private',0700);$f=__DIR__.'/private/preflight-'.$lane.'.json';file_put_contents($f,json_encode($r,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_PRESERVE_ZERO_FRACTION));chmod($f,0600);
echo json_encode(['lane'=>$lane,'queries'=>count($journal),'actor_count'=>count($r['actor']),'marked_counts'=>array_map('count',$r['marked']),'collision'=>count($r['collision'])+count($r['template_collision']),'ports'=>$r['ports'],'business_DML'=>0,'DDL'=>0,'HTTP'=>0]),"\n";
