<?php
declare(strict_types=1);
$dm=getenv('POC_DIALECT')==='dm';$lane=getenv('COMMENT_LANE');$db=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='.getenv('POC_AI_CHARSET'),getenv('POC_AI_USER'),getenv('POC_AI_PASSWORD'),[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER]);
if($dm?$db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()!=='AIZHCT_APP':($db->query('SELECT DATABASE()')->fetchColumn()!==getenv('POC_AI_SCHEMA')||strpos($db->query('SELECT VERSION()')->fetchColumn(),'5.6.')!==0))throw new RuntimeException('Actual DB drift');
$q=static function($sql,$args=[])use($db){$s=$db->prepare($sql);$s->execute($args);$r=$s->fetchAll(PDO::FETCH_ASSOC);foreach($r as &$row)foreach($row as &$v)if(is_resource($v))$v=stream_get_contents($v);return $r;};
$out=['lane'=>$lane,'identity_verified'=>true,'business_dml'=>0,'tables'=>[]];
foreach(['goods','order','order_goods','user','upload_file','order_address','order_delivery','order_delivery_goods','payment_trade','express','order_refund','order_refund_image','order_refund_address'] as $name){$table='yoshop_'.$name;$upper=strtoupper($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',[$upper]):$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',[$table]);foreach($cols as &$c)$c['column_name']=strtolower($c['column_name']);unset($c);
$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=?))",[$upper,$upper]):$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=?)',[$table,$table]);$tr=$dm?$q('SELECT COUNT(*) n FROM USER_TRIGGERS WHERE TABLE_NAME=?',[$upper]):$q('SELECT COUNT(*) n FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$table]);$out['tables'][$name]=['columns'=>$cols,'foreign_keys'=>(int)$fk[0]['n'],'triggers'=>(int)$tr[0]['n']];if($cols)$out['tables'][$name]['own_collision']=(int)$q('SELECT COUNT(*) n FROM '.$table.' WHERE store_id IN (2147001111,2147001112)')[0]['n'];
}
$out['natural_counts']=['delivery'=>$q('SELECT COUNT(*) n FROM yoshop_order_delivery'),'refund'=>$q('SELECT COUNT(*) n FROM yoshop_order_refund')];
file_put_contents(__DIR__.'/structure-'.$lane.'.json',json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));echo json_encode(['lane'=>$lane,'business_dml'=>0,'natural_counts'=>$out['natural_counts'],'tables'=>array_map(static function($t){return ['columns'=>array_column($t['columns'],'column_name'),'foreign_keys'=>$t['foreign_keys'],'triggers'=>$t['triggers'],'own_collision'=>$t['own_collision']??null];},$out['tables'])]),"\n";
