<?php

declare(strict_types=1);

if (($argv[1] ?? '') !== '--preflight') {
    echo json_encode(['status'=>'default_deny','connected'=>false,'dml'=>false]), PHP_EOL;
    exit(78);
}
$db=new PDO('dm:host=127.0.0.1;port=5238;schema=AIZHCT_APP',(string)getenv('POC_AI_USER'),
    (string)getenv('POC_AI_PASSWORD'),[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER]);
if ((string)$db->query('SELECT USER FROM DUAL')->fetchColumn() !== 'AIZHCT_APP') {
    throw new RuntimeException('AI schema drift');
}
$rule='YOSHOP_RECHARGE_GIFT_RULE';$log='YOSHOP_RECHARGE_GIFT_RULE_LOG';
$columns=[];
$stmt=$db->query("SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME IN ('$rule','$log') ORDER BY TABLE_NAME,COLUMN_ID");
foreach($stmt->fetchAll(PDO::FETCH_ASSOC)as$row)$columns[]=$row;
$identity=[];
try{$stmt=$db->query("SELECT TABLE_NAME,COLUMN_NAME,GENERATION_TYPE FROM USER_TAB_IDENTITY_COLS WHERE TABLE_NAME IN ('$rule','$log') ORDER BY TABLE_NAME,COLUMN_NAME");$identity=$stmt->fetchAll(PDO::FETCH_ASSOC);}catch(Throwable$e){$identity=['view_unavailable'];}
$definitions=[];
foreach([$rule=>'RULE_ID',$log=>'LOG_ID']as$table=>$idColumn){
    $raw=$db->query("SELECT DBMS_METADATA.GET_DDL('TABLE','".$table."') FROM DUAL")->fetchColumn();
    $ddl=is_resource($raw)?stream_get_contents($raw):(string)$raw;
    if($ddl==='')throw new RuntimeException('DDL unavailable');
    $definitions[$table]=['ddl_bytes'=>strlen($ddl),'ddl_sha12'=>substr(hash('sha256',$ddl),0,12),
        'id_column'=>$idColumn,'auto_increment'=>(bool)preg_match('/\b'.preg_quote($idColumn,'/').'\b[^,\n]*\bAUTO_INCREMENT\b/i',$ddl),
        'identity_keyword'=>stripos($ddl,'IDENTITY')!==false];
}
$semantics=[];
$stmt=$db->query("SELECT c.TABLE_NAME,c.COLUMN_NAME,cc.COMMENTS AS COLUMN_COMMENT,tc.COMMENTS AS TABLE_COMMENT FROM USER_TAB_COLUMNS c LEFT JOIN USER_COL_COMMENTS cc ON cc.TABLE_NAME=c.TABLE_NAME AND cc.COLUMN_NAME=c.COLUMN_NAME LEFT JOIN USER_TAB_COMMENTS tc ON tc.TABLE_NAME=c.TABLE_NAME WHERE c.COLUMN_NAME IN ('RULE_ID','GIFT_RULE_ID') ORDER BY c.TABLE_NAME,c.COLUMN_NAME");
foreach($stmt->fetchAll(PDO::FETCH_ASSOC)as$row)$semantics[]=$row;
$trigger=(int)$db->query("SELECT COUNT(*) FROM USER_TRIGGERS WHERE TABLE_NAME IN ('$rule','$log')")->fetchColumn();
$fk=(int)$db->query("SELECT COUNT(*) FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE='R' AND TABLE_NAME IN ('$rule','$log')")->fetchColumn();
$rows=static function(PDO$p,string$sql):array{$out=[];$s=$p->query($sql);while(($r=$s->fetch(PDO::FETCH_ASSOC))!==false){$clean=[];foreach(array_change_key_case($r,CASE_LOWER)as$k=>$v)$clean[$k]=is_resource($v)?stream_get_contents($v):$v;ksort($clean);$out[]=$clean;}return$out;};
$rules=$rows($db,"SELECT * FROM $rule WHERE STORE_ID=10001 AND RULE_NAME NOT LIKE 'CDXGRW%' ORDER BY RULE_ID");
$logs=$rows($db,"SELECT * FROM $log WHERE STORE_ID=10001 AND OPERATOR_NAME NOT LIKE 'CDXGRW%' ORDER BY LOG_ID");
$marker=(int)$db->query("SELECT (SELECT COUNT(*) FROM $rule WHERE RULE_NAME LIKE 'CDXGRW%' OR CREATE_BY LIKE 'CDXGRW%' OR UPDATE_BY LIKE 'CDXGRW%') + (SELECT COUNT(*) FROM $log WHERE OPERATOR_ID LIKE 'CDXGRW%' OR OPERATOR_NAME LIKE 'CDXGRW%') FROM DUAL")->fetchColumn();
echo json_encode(['status'=>'c_schema_readonly_ready','current_user'=>'AIZHCT_APP','columns'=>$columns,
    'identity'=>$identity,'definitions'=>$definitions,'reference_semantics'=>$semantics,'foreign_keys'=>$fk,'triggers'=>$trigger,
    'rule_rows'=>count($rules),'log_rows'=>count($logs),'natural_sha'=>hash('sha256',serialize([$rules,$logs])),
    'marker_rows'=>$marker,'http_sent'=>false,'dml'=>false],JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES),PHP_EOL;
