<?php

declare(strict_types=1);

// Only table/column names and COUNT(*). Never select the VALUES configuration column.
set_exception_handler(static function (Throwable $error): void {
    fwrite(STDERR, 'PUBLIC_SETTING_METADATA_FAILED ' . get_class($error) . PHP_EOL);
    exit(2);
});
$variant = (string)getenv('POC_VARIANT');
if (!in_array($variant, ['B', 'C'], true)) throw new RuntimeException('Only B/C test scopes');
if ($variant === 'C') {
    $env = [];
    foreach (explode("\0", (string)@file_get_contents('/proc/53772/environ')) as $item) {
        $parts = explode('=', $item, 2);
        if (count($parts) === 2) $env[$parts[0]] = $parts[1];
    }
    if (($env['POC_TARGET_ROOT'] ?? '') !== '/tmp/zhct-ai-http-20260929.3XDj3w'
        || ($env['POC_DIALECT'] ?? '') !== 'dm'
        || ($env['POC_AI_HOST'] ?? '') !== '127.0.0.1'
        || ($env['POC_AI_PORT'] ?? '') !== '5238'
        || ($env['POC_AI_SCHEMA'] ?? '') !== 'AIZHCT_APP'
        || ($env['POC_AI_USER'] ?? '') !== 'AIZHCT_APP') {
        throw new RuntimeException('C AI non-production boundary mismatch');
    }
    $db = new PDO('dm:host=' . $env['POC_AI_HOST'] . ';port=' . $env['POC_AI_PORT']
        . ';schema=' . $env['POC_AI_SCHEMA'], $env['POC_AI_USER'],
        $env['POC_AI_PASSWORD'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    if ((string)$db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")
        ->fetchColumn() !== 'AIZHCT_APP') {
        throw new RuntimeException('C effective AI schema mismatch');
    }
    $tables = ['wxapp' => 'YOSHOP_WXAPP_SETTING',
        'store_setting' => 'YOSHOP_STORE_SETTING', 'store' => 'YOSHOP_STORE'];
    $keyField = '"KEY"';
} else {
    $path = '/Users/wiscourper/Documents/workspace/zhct/zhctproject/ai_api/.env.local';
    $local = parse_ini_file($path, true, INI_SCANNER_RAW);
    if (!is_array($local) || !isset($local['DATABASE'])
        || trim((string)shell_exec('lsof -nP -iTCP:18101 -sTCP:LISTEN -t 2>/dev/null')) !== '13127') {
        throw new RuntimeException('B code local/listener boundary missing');
    }
    $process = (string)shell_exec('ps eww -p 13127 -o command=');
    $expected = ['POC_DIALECT' => 'mysql',
        'POC_TARGET_ROOT' => '/tmp/zhct-http-ai-macos.x2CCZX',
        'POC_BASE_URL' => 'http://127.0.0.1:18101'];
    foreach (['HOSTNAME' => 'HOST', 'HOSTPORT' => 'PORT',
        'DATABASE' => 'SCHEMA', 'USERNAME' => 'USER',
        'PASSWORD' => 'PASSWORD'] as $source => $target) {
        $expected['POC_AI_' . $target] = (string)$local['DATABASE'][$source];
    }
    foreach ($expected as $key => $value) {
        $pattern = '/(?:^|\\s)' . preg_quote($key, '/') . '=([^\\s]*)/';
        if (!preg_match($pattern, $process, $match) || $match[1] !== $value) {
            throw new RuntimeException('B runtime differs from code local AI DB');
        }
    }
    $x = $local['DATABASE'];
    $db = new PDO('mysql:host=' . $x['HOSTNAME'] . ';port=' . ($x['HOSTPORT'] ?? 3306)
        . ';dbname=' . $x['DATABASE'] . ';charset=utf8', $x['USERNAME'],
        $x['PASSWORD'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_TIMEOUT => 5]);
    $tables = ['wxapp' => 'yoshop_wxapp_setting',
        'store_setting' => 'yoshop_store_setting', 'store' => 'yoshop_store'];
    $keyField = '`key`';
}
$columns = static function (PDO $db, string $table) use ($variant): array {
    $stmt = $variant === 'C'
        ? $db->prepare('SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME=?')
        : $db->prepare('SELECT COLUMN_NAME FROM information_schema.COLUMNS'
            . ' WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?');
    $stmt->execute([$table]);
    return array_map('strtoupper', $stmt->fetchAll(PDO::FETCH_COLUMN));
};
$presence = [];
foreach (['wxapp', 'store_setting'] as $which) {
    $actual = $columns($db, $tables[$which]);
    $presence[$which] = count(array_diff(['STORE_ID', 'KEY', 'VALUES'], $actual)) === 0;
    if (!$presence[$which]) throw new RuntimeException('Required setting table columns missing');
}
$presence['store'] = count(array_diff(['STORE_ID'],
    $columns($db, $tables['store']))) === 0;
if (!$presence['store']) throw new RuntimeException('Store info table missing');
$count = static function (PDO $db, string $sql, array $args = []): int {
    $stmt = $db->prepare($sql);
    $stmt->execute($args);
    return (int)$stmt->fetchColumn();
};
$counts = [
    'store_info' => $count($db, 'SELECT COUNT(*) FROM ' . $tables['store']
        . ' WHERE STORE_ID=?', [10001]),
    'wxapp_aiConfig' => $count($db, 'SELECT COUNT(*) FROM ' . $tables['wxapp']
        . ' WHERE STORE_ID=? AND ' . $keyField . '=?', [10001, 'aiConfig']),
];
foreach (['app_theme', 'page_category_template', 'points', 'recharge',
    'register', 'customer', 'login'] as $item) {
    $counts['store_' . $item] = $count($db, 'SELECT COUNT(*) FROM '
        . $tables['store_setting'] . ' WHERE STORE_ID IN (0,?) AND '
        . $keyField . '=?', [10001, $item]);
}
echo json_encode(['variant' => $variant, 'mode' => 'metadata-and-row-count-only',
    'required_columns_present' => $presence, 'counts' => $counts],
    JSON_UNESCAPED_SLASHES) . PHP_EOL;
