<?php
declare(strict_types=1);
$lane=getenv('MR3_LANE');$root=getenv('MR3_ROOT');$cfg=(static function($f){return require $f;})($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 local');$dsn='mysql:host='.$cfg['hostname'].';port='.($cfg['hostport']?:3306).';dbname='.$cfg['database'].';charset=utf8mb4';}else{if($cfg['hostname']!=='127.0.0.1'||(string)$cfg['hostport']!=='5237'||$cfg['database']!=='ZHCT_APP')throw new RuntimeException('DM scope');$dsn='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]);$q=static function(string $sql,array $args=[])use($db):array{$s=$db->prepare($sql);$s->execute($args);$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)>10000)throw new RuntimeException('Bounded table cap');}return $rows;};$check=static function(bool $ok,string $why):void{if(!$ok)throw new RuntimeException($why);};
$tables=['marketing_strategy','marketing_strategy_department','marketing_strategy_identity','marketing_strategy_restaurant','marketing_strategy_scenario','marketing_strategy_mealtimes','marketing_strategy_time_range'];$p=$lane==='B'?'ydy_':'YDY_';$report=['lane'=>$lane,'business_dml'=>0,'ddl'=>0,'safe'=>false,'tables'=>[]];
try{if($lane==='B')$check(strpos($db->query('SELECT VERSION()')->fetchColumn(),'5.6.')===0&&$db->query('SELECT DATABASE()')->fetchColumn()===$cfg['database'],'MySQL effective identity');else $check($db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()==='ZHCT_APP','DM effective identity');
 $stall=$q('SELECT ID,UUID,NAME,CREATE_BY,STALL_TYPE FROM '.$p.'restaurants WHERE ID=?',[$lane==='B'?77:12]);$marker=$lane==='B'?'CDXCENTB3C677BA4':'CDXCENTC789071DA';$check(count($stall)===1&&$stall[0]['name']===$marker&&$stall[0]['create_by']===$marker&&(int)$stall[0]['stall_type']===1,'Exact prior CDX stall ownership');$report['owned_stall']=['id'=>(int)$stall[0]['id'],'marker'=>$marker,'ownership_verified'=>true];
 foreach($tables as $t){$name=$p.$t;$cols=$lane==='B'?$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,EXTRA FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$name]):$q('SELECT COLUMN_NAME,DATA_TYPE,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[strtoupper($name)]);$check($cols!==[],'Required table absent '.$t);$triggers=$lane==='B'?$q('SELECT TRIGGER_NAME,EVENT_MANIPULATION FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$name]):$q('SELECT TRIGGER_NAME,STATUS,TRIGGERING_EVENT FROM USER_TRIGGERS WHERE TABLE_NAME=?',[strtoupper($name)]);$check($triggers===[],'Unknown trigger '.$t);$rows=$q('SELECT * FROM '.$name.' ORDER BY ID');$report['tables'][$t]=['columns'=>$cols,'triggers'=>$triggers,'rows'=>count($rows),'sha256'=>hash('sha256',serialize($rows))];}
 $departments=$q('SELECT UUID,NAME FROM '.$p.'department WHERE IS_SHOW=1 ORDER BY ID');$identities=$q('SELECT ID,IDENTITY_TYPE FROM '.$p.'identity_type WHERE IS_DELETE=0 ORDER BY ID');$check($departments!==[]&&$identities!==[],'Natural readonly reference exists');$private=['stall'=>$stall[0],'department'=>$departments[0],'identity'=>$identities[0]];file_put_contents(__DIR__.'/private-reference.json',json_encode($private));chmod(__DIR__.'/private-reference.json',0600);$report['natural_reference']=['department_exists'=>true,'identity_exists'=>true,'department_sha256'=>hash('sha256',serialize($private['department'])),'identity_sha256'=>hash('sha256',serialize($private['identity']))];$report['safe']=true;$report['failure']=null;
}catch(Throwable $e){$report['failure']=['class'=>get_class($e),'reason'=>$e->getMessage()];}
file_put_contents(__DIR__.'/preflight-private.json',json_encode($report,JSON_PRETTY_PRINT));chmod(__DIR__.'/preflight-private.json',0600);if(defined('CDX_MS_CONTEXT')){if(!$report['safe'])throw new RuntimeException('Marketing preflight not safe');return;}echo json_encode($report),"\n";exit($report['safe']?0:2);
