<?php
declare(strict_types=1);require __DIR__.'/common.php';
set_exception_handler(static function(Throwable $error):void{smSave('metadata-error-private.json',['class'=>get_class($error),'message'=>$error->getMessage()]);echo json_encode(['status'=>'metadata-error','class'=>get_class($error),'message_sha256'=>hash('sha256',$error->getMessage())]),PHP_EOL;exit(1);});
$lane=getenv('SM7_LANE');$port=(int)getenv('SM7_PORT');if($socket=@fsockopen('127.0.0.1',$port,$number,$error,1)){fclose($socket);throw new RuntimeException('Assigned private port occupied');}
$requirements=[
 'POST /p/cater/search'=>['dishes'=>['is_del','status','id','uuid','name'],'food'=>['name','sub_name','id'],'dish'=>['composition_id','composition_ratio','dishes_uuid']],
 'POST /p/bill/dishesAll'=>['dishes'=>['uuid','name','category','sub_category','is_study','is_del','status','en_name'],'food'=>['name','sub_name','id'],'dish'=>['composition_id','composition_ratio','dishes_uuid'],'recipes'=>['menu_date','meal_times','restaurant_id','dishes_uuid'],'identity_type'=>['id','identity_type','is_delete']],
 'POST /api/card/cardList'=>['staff'=>['is_show','id','uuid','name','mobile'],'staff_card'=>['staff_uuid','is_delete','is_cancel','card_id','card_status','create_time','cost'],'staff_department'=>['staff_uuid','department_uuid'],'department'=>['uuid','name','is_show']],
 'POST /api/card/logList'=>['staff_card_log'=>['id','is_delete','operate_time','operate_date','card_id','operate_type','operator','staff_uuid'],'staff'=>['uuid','name','mobile'],'staff_department'=>['staff_uuid','department_uuid']],
 'POST /p/Restaurant/restaurant_list'=>['restaurants'=>['id','name','is_delete','restaurant_shop_id','status'],'restaurant_shop'=>['id','name','is_delete']],
 'POST /p/Restaurant/restaurant_read'=>['restaurants'=>['id','file_path','restaurant_shop_id','status','morning_start','morning_end','noon_start','noon_end','night_start','night_end'],'restaurant_shop'=>['id','name'],'config'=>['id','config_key','config_value','status']],
 'POST /p/Restaurant/mealTimeCount'=>['department'=>['uuid','name','leaf_flag','status','is_show'],'date_menu'=>['menu_date','restaurant_id','meal_type','staff_uuid','meal_times'],'staff_department'=>['staff_uuid','department_uuid']],
];
$tables=[];foreach($requirements as $needed){$tables=array_merge($tables,array_keys($needed));}$tables=array_values(array_unique($tables));$db=smPdo();$metadata=[];
foreach($tables as $table){$physical='ydy_'.($table==='food'?'foods_composition':$table);$metadata[$table]=smRows($db,$lane==='C'?'SELECT COLUMN_NAME,DATA_TYPE,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID':'SELECT COLUMN_NAME,DATA_TYPE,COLUMN_TYPE,NUMERIC_PRECISION,NUMERIC_SCALE,DATETIME_PRECISION,IS_NULLABLE,CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$lane==='C'?strtoupper($physical):$physical]);}
$gates=[];foreach($requirements as $route=>$needed){$missing=[];foreach($needed as $table=>$columns){$actual=array_map('strtolower',array_column($metadata[$table],'column_name'));foreach($columns as $column){if(!in_array($column,$actual,true)){$missing[]=$table.'.'.$column;}}}$gates[$route]=['necessary_columns_ready'=>$missing===[],'missing'=>$missing];}
$sensitive=[];foreach($metadata['restaurants'] as $column){if(preg_match('/(?:password|passwd|pwd|secret|token|private.?key|access.?key|api.?key|^zp.*key$)/i',$column['column_name'])){$sensitive[]=$column['column_name'];}}
foreach(['POST /p/Restaurant/restaurant_list','POST /p/Restaurant/restaurant_read'] as $route){$gates[$route]['sensitive_star_columns']=$sensitive;$gates[$route]['star_metadata_contract_pending']=true;}
$result=['lane'=>$lane,'metadata'=>$metadata,'gates'=>$gates,'actual_schema_identity_verified'=>true,'assigned_port_was_empty'=>true,'business_rows_selected'=>0,'business_dml_ddl'=>0,'ai_or_external_datacenter_connected'=>false];smSave('metadata-private.json',$result);
echo json_encode(['lane'=>$lane,'gates'=>$gates,'actual_schema_identity_verified'=>true,'assigned_port_was_empty'=>true,'business_rows_selected'=>0,'business_dml_ddl'=>0]),PHP_EOL;
