<?php
declare(strict_types=1);
$dm=getenv('POC_DIALECT')==='dm';$lane=getenv('ANALYSIS_LANE');
try{$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=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('Private metadata identity connection unavailable');}
$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;};
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('Database identity drift');
$tables=['meal','meal_infos','dishes','meal_recommend','meal_score_subtable','dietary_recommend','dishes_cate','config_enum'];$metadata=[];foreach($tables as $t){$name='yoshop_'.$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',[strtoupper($name)]):$q('SELECT COLUMN_NAME,DATA_TYPE,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$name]);$metadata[$t]=['columns'=>$cols,'rows'=>$cols?(int)$q('SELECT COUNT(*) n FROM '.$name)[0]['n']:null];}
$candidate=$q('SELECT store_id,staff_id,COUNT(*) n FROM yoshop_meal WHERE is_delete=0 AND is_loading=0 AND meal_times IN (1,2,3) GROUP BY store_id,staff_id ORDER BY n DESC');$candidate=array_slice($candidate,0,30);$selected=[];foreach($candidate as $c){$sql='SELECT * FROM yoshop_meal WHERE store_id=? AND staff_id=? AND is_delete=0 ORDER BY meal_time DESC';$r=$q($sql,[$c['store_id'],$c['staff_id']]);if(!$r||$r[0]['is_loading']!=0||!in_array((int)$r[0]['meal_times'],[1,2,3],true))continue;$last=$r[0];if(isset($r[1])&&$r[1]['meal_time']===$last['meal_time'])continue;$links=$q('SELECT COUNT(*) n FROM yoshop_meal_infos WHERE store_id=? AND meal_id=? AND is_delete=0',[$c['store_id'],$last['id']]);$rec=$q('SELECT COUNT(*) n FROM yoshop_meal_recommend WHERE store_id=? AND staff_id=? AND meal_date=? AND is_delete=0',[$c['store_id'],$c['staff_id'],$last['meal_date']]);$selected[]=['store_id'=>(int)$c['store_id'],'staff_id'=>(int)$c['staff_id'],'last_meal'=>$last,'infos_rows'=>(int)$links[0]['n'],'recommend_rows'=>(int)$rec[0]['n']];if($links[0]['n']>0&&$rec[0]['n']==1)break;}
if(!is_dir(__DIR__.'/private'))mkdir(__DIR__.'/private',0700);$private=['lane'=>$lane,'candidate'=>$candidate,'selected'=>$selected];file_put_contents(__DIR__.'/private/metadata-samples.json',json_encode($private,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));chmod(__DIR__.'/private/metadata-samples.json',0600);$out=['lane'=>$lane,'business_DML'=>0,'metadata'=>$metadata,'candidate_count'=>count($candidate),'samples_checked'=>count($selected),'complete_nonempty_candidate'=>count($selected)>0&&end($selected)['infos_rows']>0&&end($selected)['recommend_rows']===1];file_put_contents(__DIR__.'/metadata-'.$lane.'.json',json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));echo json_encode(['lane'=>$lane,'table_rows'=>array_map(static function($x){return $x['rows'];},$metadata),'candidate_count'=>count($candidate),'samples_checked'=>count($selected),'complete_nonempty'=>$out['complete_nonempty_candidate']]),"\n";
