<?php
declare(strict_types=1);
$dm=getenv('POC_DIALECT')==='dm';$lane=(string)getenv('META_LANE');
try{$pdo=new PDO($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=utf8',getenv('POC_AI_USER'),getenv('POC_AI_PASSWORD'),[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER]);}catch(Throwable $e){throw new RuntimeException('Weight metadata connection failed');}
if($dm){if($pdo->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()!=='AIZHCT_APP')throw new RuntimeException('DM identity');}elseif(strpos((string)$pdo->query('SELECT VERSION()')->fetchColumn(),'5.6.')!==0||$pdo->query('SELECT DATABASE()')->fetchColumn()!==getenv('POC_AI_SCHEMA'))throw new RuntimeException('Local MySQL identity');
$q=static function(string $sql,array $args=[])use($pdo):array{$s=$pdo->prepare($sql);$s->execute($args);$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);return $rows;};
$tables=['user','staff','nurtrition','habit','user_weight_status','nurtition_target','meal_recommend','meal_recommend_history'];$out=[];
foreach($tables as $table){$name='yoshop_'.$table;$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',[strtoupper($name)]):
    $q('SELECT COLUMN_NAME,DATA_TYPE,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,DATETIME_PRECISION,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$name]);
    $indexes=$dm?$q('SELECT i.INDEX_NAME,i.UNIQUENESS,c.COLUMN_NAME,c.COLUMN_POSITION FROM USER_INDEXES i JOIN USER_IND_COLUMNS c ON i.INDEX_NAME=c.INDEX_NAME WHERE i.TABLE_NAME=? ORDER BY i.INDEX_NAME,c.COLUMN_POSITION',[strtoupper($name)]):
        $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',[$name]);
    if(!$cols)throw new RuntimeException('Missing weight scope table '.$table);
    $out[$table]=['columns'=>$cols,'indexes'=>$indexes,'natural_rows'=>(int)$q('SELECT COUNT(*) n FROM '.$name)[0]['n'],'synthetic_collision_rows'=>(int)$q('SELECT COUNT(*) n FROM '.$name.' WHERE store_id=2147001021')[0]['n']];
}
$list=implode(',',array_map(static function(string $t)use($dm):string{return "'".($dm?strtoupper('yoshop_'.$t):'yoshop_'.$t)."'";},$tables));
$triggers=(int)($dm?$q('SELECT COUNT(*) n FROM USER_TRIGGERS WHERE TABLE_NAME IN ('.$list.')'):$q('SELECT COUNT(*) n FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE IN ('.$list.')'))[0]['n'];
$fk=(int)($dm?$q("SELECT COUNT(*) n FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE='R' AND (TABLE_NAME IN (".$list.') OR R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('.$list.')))'):
    $q('SELECT COUNT(*) n FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND (TABLE_NAME IN ('.$list.') OR REFERENCED_TABLE_NAME IN ('.$list.'))'))[0]['n'];
echo json_encode(['lane'=>$lane,'read_only'=>true,'business_dml'=>0,'foreign_keys'=>$fk,'triggers'=>$triggers,'metadata'=>$out],JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES),"\n";exit($fk!==0||$triggers!==0?1:0);
