<?php

declare(strict_types=1);

set_exception_handler(static function (Throwable $error): void {
    fwrite(STDERR, 'N3_AB_CLEANUP_READ_FAILED ' . get_class($error) . PHP_EOL);
    exit(2);
});

$marker = (string)($argv[1] ?? '');
if (!preg_match('/^CDXPARNUN3[A-F0-9]{8}$/D', $marker)) {
    throw new RuntimeException('Invalid exact synthetic marker');
}
$variant = (string)getenv('POC_VARIANT');
$runtimes = [
    'A' => ['/tmp/zhct-http-ai-macos.zjaU8h', 'http://127.0.0.1:18105', 13109],
    'B' => ['/tmp/zhct-http-ai-macos.x2CCZX', 'http://127.0.0.1:18101', 13127],
];
if (!isset($runtimes[$variant])) throw new RuntimeException('Only isolated A/B allowed');
[$root, $base, $pid] = $runtimes[$variant];
$localPath = '/Users/wiscourper/Documents/workspace/zhct/zhctproject/ai_api/.env.local';
if (realpath((string)getenv('POC_MYSQL_LOCAL_ENV')) !== realpath($localPath)) {
    throw new RuntimeException('Only code local DB allowed');
}
$local = parse_ini_file($localPath, true, INI_SCANNER_RAW);
if (!is_array($local) || !isset($local['DATABASE'], $local['DATABASE_ZHCT'])) {
    throw new RuntimeException('Code local two-business-DB config absent');
}
$port = $variant === 'A' ? 18105 : 18101;
if (trim((string)shell_exec('lsof -nP -iTCP:' . $port . ' -sTCP:LISTEN -t 2>/dev/null')) !== (string)$pid) {
    throw new RuntimeException('A/B listener changed');
}
$process = (string)shell_exec('ps eww -p ' . $pid . ' -o command=');
if (strpos($process, $root . '/public') === false
    || strpos($process, 'php -S 127.0.0.1:' . $port) === false) {
    throw new RuntimeException('A/B process identity mismatch');
}
$expected = ['POC_TARGET_ROOT' => $root, 'POC_BASE_URL' => $base,
    'POC_DIALECT' => 'mysql'];
foreach (['DATABASE' => 'POC_AI_', 'DATABASE_ZHCT' => 'POC_'] as $section => $prefix) {
    foreach (['HOSTNAME' => 'HOST', 'HOSTPORT' => 'PORT',
        'DATABASE' => 'SCHEMA', 'USERNAME' => 'USER',
        'PASSWORD' => 'PASSWORD'] as $from => $to) {
        $expected[$prefix . $to] = (string)$local[$section][$from];
    }
}
foreach ($expected as $key => $value) {
    $pattern = '/(?:^|\s)' . preg_quote($key, '/') . '=([^\s]*)/';
    if (!preg_match($pattern, $process, $match) || $match[1] !== $value) {
        throw new RuntimeException('A/B HTTP DB differs from code local');
    }
}
$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_CASE => PDO::CASE_LOWER, PDO::ATTR_TIMEOUT => 5]);
if ((string)$db->query('SELECT DATABASE()')->fetchColumn() !== (string)$x['DATABASE']) {
    throw new RuntimeException('A/B effective AI schema mismatch');
}
$counts = [];
foreach ([
    'operator' => ['yoshop_store_user', 'USER_NAME'],
    'staff' => ['yoshop_staff', 'NAME'],
    'weight' => ['yoshop_staff_weight', 'CREATE_BY'],
    'meal' => ['yoshop_meal', 'CREATE_BY'],
    'meal_infos' => ['yoshop_meal_infos', 'CREATE_BY'],
    'dishes_marker' => ['yoshop_dishes', 'NAME'],
] as $key => [$table, $field]) {
    $stmt = $db->prepare('SELECT COUNT(*) FROM ' . $table . ' WHERE ' . $field . '=?');
    $stmt->execute([$marker]);
    $counts[$key] = (int)$stmt->fetchColumn();
}
$stmt = $db->prepare('SELECT * FROM yoshop_dishes WHERE ID=? AND STORE_ID=10001');
$stmt->execute([1]);
$dish = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
$dishHash = '';
if (is_array($dish)) {
    ksort($dish);
    $encoded = json_encode($dish, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    $dishHash = is_string($encoded) ? hash('sha256', $encoded) : '';
}
$expectedDishHash = '1dce2657c898f1c88cb009a1089a57d39338ba7202201f0e4ca9116236287b0d';
$pass = array_sum($counts) === 0 && hash_equals($expectedDishHash, $dishHash);
echo json_encode(['variant' => $variant, 'marker' => $marker,
    'table_marker_counts' => $counts,
    'readonly_dish_id' => 1,
    'readonly_dish_hash_unchanged' => $dishHash === $expectedDishHash,
    'pass' => $pass], JSON_UNESCAPED_SLASHES) . PHP_EOL;
exit($pass ? 0 : 1);
