<?php

declare(strict_types=1);

// Isolated driver smoke test. Never point this at a production database.
$dialect = getenv('POC_DIALECT');
$dsn = getenv('POC_DSN');
$user = getenv('POC_USER');
$password = getenv('POC_PASSWORD');
if (!in_array($dialect, ['mysql', 'dm'], true) || !$dsn || !$user || !$password) {
    fwrite(STDERR, "Missing isolated PoC connection settings\n");
    exit(2);
}

$table = 'CODEX_DB_POC_' . strtoupper(bin2hex(random_bytes(4)));
$pdo = new PDO($dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$created = false;

try {
    if ($dialect === 'dm') {
        $check = $pdo->prepare('SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=?');
        $check->execute([$table]);
        if ((int)$check->fetchColumn() !== 0) {
            throw new RuntimeException('Temporary PoC name already exists');
        }
        $pdo->exec('CREATE TABLE "' . $table . '" ("ID" INT AUTO_INCREMENT PRIMARY KEY, "V_TEXT" VARCHAR(40))');
    } else {
        $pdo->exec('CREATE TEMPORARY TABLE `' . $table . '` (`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `V_TEXT` VARCHAR(40)) ENGINE=InnoDB');
    }
    $created = true;

    $pdo->beginTransaction();
    $insert = $pdo->prepare('INSERT INTO ' . $table . ' (V_TEXT) VALUES (?)');
    $insert->execute(['回滚测试']);
    $insertId = $pdo->lastInsertId();
    $pdo->rollBack();
    $afterRollback = (int)$pdo->query('SELECT COUNT(*) FROM ' . $table)->fetchColumn();
    if ($afterRollback !== 0) {
        throw new RuntimeException('Rollback left a persisted row');
    }

    $pdo->beginTransaction();
    $insert->execute(['提交测试']);
    $committedId = $pdo->lastInsertId();
    $pdo->commit();
    $read = $pdo->prepare('SELECT V_TEXT FROM ' . $table . ' WHERE ID=?');
    $read->execute([$committedId]);
    $value = $read->fetchColumn();
    if ($value !== '提交测试') {
        throw new RuntimeException('Committed row could not be read by generated id');
    }
    $update = $pdo->prepare('UPDATE ' . $table . ' SET V_TEXT=? WHERE ID=?');
    $update->execute(['更新测试', $committedId]);
    $delete = $pdo->prepare('DELETE FROM ' . $table . ' WHERE ID=?');
    $delete->execute([$committedId]);
    $afterDelete = (int)$pdo->query('SELECT COUNT(*) FROM ' . $table)->fetchColumn();
    if ($afterDelete !== 0) {
        throw new RuntimeException('Delete left a persisted row');
    }

    echo json_encode([
        'dialect' => $dialect,
        'pdo_driver' => $pdo->getAttribute(PDO::ATTR_DRIVER_NAME),
        'rollback_count' => $afterRollback,
        'generated_id_nonempty' => $insertId !== '' && $committedId !== '',
        'insert_read_update_delete' => 'passed',
    ], JSON_UNESCAPED_UNICODE) . PHP_EOL;
} finally {
    if ($created && $dialect === 'dm') {
        $pdo->exec('DROP TABLE "' . $table . '"');
        $check = $pdo->prepare('SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=?');
        $check->execute([$table]);
        if ((int)$check->fetchColumn() !== 0) {
            throw new RuntimeException('PoC table cleanup failed');
        }
    }
}
