<?php
declare(strict_types=1);

// Read-only C DM8 AI source count of prior synthetic chat rows. No content read.
set_exception_handler(static function (Throwable $error): void {
    echo json_encode(['status' => 'preflight-error', 'class' => get_class($error),
        'code' => (string)$error->getCode()], JSON_UNESCAPED_SLASHES), PHP_EOL;
    exit(2);
});
$pid = 53772;
$raw = file_get_contents('/proc/' . $pid . '/environ');
$cmd = file_get_contents('/proc/' . $pid . '/cmdline');
if ($raw === false || $cmd === false || strpos($cmd, '127.0.0.1:18102') === false
    || strpos($cmd, '/tmp/zhct-ai-http-20260929.3XDj3w/public') === false) {
    throw new RuntimeException('C isolated AI service unavailable');
}
$env = [];
foreach (explode("\0", $raw) as $part) {
    if (strpos($part, 'POC_') !== 0) continue;
    $at = strpos($part, '=');
    if ($at !== false) $env[substr($part, 0, $at)] = substr($part, $at + 1);
}
foreach (['POC_DIALECT' => 'dm', 'POC_EXTERNAL_STUBS' => '1',
    'POC_AI_HOST' => '127.0.0.1', 'POC_AI_PORT' => '5238',
    'POC_AI_SCHEMA' => 'AIZHCT_APP'] as $key => $expected) {
    if (($env[$key] ?? null) !== $expected) throw new RuntimeException('C AI DB boundary mismatch');
}
if (empty($env['POC_AI_USER']) || empty($env['POC_AI_PASSWORD'])) {
    throw new RuntimeException('C private AI credentials unavailable');
}
$pdo = new PDO('dm:host=127.0.0.1;port=5238;schema=AIZHCT_APP',
    $env['POC_AI_USER'], $env['POC_AI_PASSWORD'], [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ]);
$owner = strtoupper((string)$pdo->query('SELECT USER FROM DUAL')->fetchColumn());
$schema = strtoupper((string)$pdo->query(
    "SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn());
if ($owner !== 'AIZHCT_APP' || $schema !== 'AIZHCT_APP') {
    throw new RuntimeException('C AI DB identity mismatch');
}
$s = $pdo->query("SELECT COUNT(*) FROM YOSHOP_AI_CONVERSATION_SESSION "
    . "WHERE STORE_ID=10001 AND IS_DELETE=0 AND (AI_USER_ID LIKE 'CDX%' OR AI_USER_ID LIKE 'POC%')");
$m = $pdo->query("SELECT COUNT(*) FROM YOSHOP_AI_CONVERSATION "
    . "WHERE STORE_ID=10001 AND (USER_ID LIKE 'CDX%' OR USER_ID LIKE 'POC%')");
$meta = $pdo->query("SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,NULLABLE,DATA_DEFAULT "
    . "FROM USER_TAB_COLUMNS WHERE TABLE_NAME IN "
    . "('YOSHOP_AI_CONVERSATION_SESSION','YOSHOP_AI_CONVERSATION') "
    . "ORDER BY TABLE_NAME,COLUMN_ID")->fetchAll(PDO::FETCH_ASSOC);
$metadataKeys = $pdo->query("SELECT * FROM USER_TAB_COLUMNS "
    . "WHERE TABLE_NAME='YOSHOP_AI_CONVERSATION_SESSION' AND COLUMN_NAME='ID'")
    ->fetch(PDO::FETCH_ASSOC);
$ddlEvidence = [];
foreach (['YOSHOP_AI_CONVERSATION_SESSION', 'YOSHOP_AI_CONVERSATION'] as $tableName) {
    try {
        $ddl = $pdo->query("SELECT DBMS_METADATA.GET_DDL('TABLE','" . $tableName
            . "') FROM DUAL")->fetchColumn();
        $text = is_resource($ddl) ? stream_get_contents($ddl) : (string)$ddl;
        $idLine = '';
        if (preg_match('/[^\r\n]*[" ]ID[" ]+[^\r\n]*/i', (string)$text, $match)) {
            $idLine = trim($match[0]);
        }
        $ddlEvidence[$tableName] = ['available' => true,
            'identity_token' => stripos((string)$text, 'IDENTITY') !== false,
            'autoincrement_token' => stripos((string)$text, 'AUTOINCREMENT') !== false,
            'auto_increment_token' => stripos((string)$text, 'AUTO_INCREMENT') !== false,
            'generated_token' => stripos((string)$text, 'GENERATED') !== false,
            'id_line' => $idLine,
            'ddl_sha256' => hash('sha256', (string)$text)];
    } catch (Throwable $error) {
        $ddlEvidence[$tableName] = ['available' => false,
            'class' => get_class($error), 'code' => (string)$error->getCode()];
    }
}
$uniqueIndex = [];
try {
    $uniqueIndex = $pdo->query("SELECT i.TABLE_NAME,i.INDEX_NAME,c.COLUMN_NAME,c.COLUMN_POSITION "
        . "FROM USER_INDEXES i JOIN USER_IND_COLUMNS c ON c.INDEX_NAME=i.INDEX_NAME "
        . "WHERE i.TABLE_NAME IN ('YOSHOP_AI_CONVERSATION_SESSION','YOSHOP_AI_CONVERSATION') "
        . "AND i.UNIQUENESS='UNIQUE' ORDER BY i.TABLE_NAME,i.INDEX_NAME,c.COLUMN_POSITION")
        ->fetchAll(PDO::FETCH_ASSOC);
} catch (Throwable $error) {
    $uniqueIndex = [['metadata_error_class' => get_class($error),
        'code' => (string)$error->getCode()]];
}
echo json_encode(['source' => 'approved-nonprod-dm-ai',
    'database_fingerprint' => hash('sha256', $owner . '|5238|' . $schema),
    'synthetic_session_rows' => (int)$s->fetchColumn(),
    'synthetic_message_rows' => (int)$m->fetchColumn(), 'columns' => $meta,
    'id_metadata_keys' => is_array($metadataKeys) ? array_keys($metadataKeys) : [],
    'ddl_evidence' => $ddlEvidence, 'unique_index_columns' => $uniqueIndex],
    JSON_UNESCAPED_SLASHES), PHP_EOL;
