<?php

declare(strict_types=1);

// Offline option-merging audit. Uses dummy connection config and opens no PDO connection.
$root = realpath((string) getenv('POC_APP_ROOT'));
if (!$root || strpos($root, '/tmp/zhct-') !== 0 || !defined('PDO::EXTRA_DECIMAL')) {
    throw new RuntimeException('Isolated candidate framework required');
}
require $root . '/vendor/autoload.php';
$overrides = [
    PDO::ATTR_CASE => PDO::CASE_LOWER,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_STRINGIFY_FETCHES => true,
    PDO::EXTRA_DECIMAL => 1,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
];
$config = [
    'type' => \app\common\database\Dm::class,
    'hostname' => '127.0.0.1', 'hostport' => 5236,
    'database' => 'SYNTHETIC', 'username' => 'SYNTHETIC',
    'password' => 'SYNTHETIC', 'prefix' => '', 'debug' => false,
    'params' => $overrides,
];
$manager = new \think\DbManager();
$manager->setConfig(['default' => 'probe', 'connections' => ['probe' => $config]]);
$connection = $manager->connect('probe');
$property = new ReflectionProperty($connection, 'params');
$property->setAccessible(true);
$defaults = $property->getValue($connection);
$effective = $connection->getConfig('params') + $defaults;
$names = [
    PDO::ATTR_CASE => 'PDO::ATTR_CASE',
    PDO::ATTR_ERRMODE => 'PDO::ATTR_ERRMODE',
    PDO::ATTR_ORACLE_NULLS => 'PDO::ATTR_ORACLE_NULLS',
    PDO::ATTR_STRINGIFY_FETCHES => 'PDO::ATTR_STRINGIFY_FETCHES',
    PDO::EXTRA_DECIMAL => 'PDO::EXTRA_DECIMAL',
    PDO::ATTR_DEFAULT_FETCH_MODE => 'PDO::ATTR_DEFAULT_FETCH_MODE',
    PDO::ATTR_EMULATE_PREPARES => 'PDO::ATTR_EMULATE_PREPARES',
];
$rows = [];
foreach ($effective as $key => $value) {
    $rows[] = ['option' => $names[$key] ?? 'UNKNOWN_PDO_OPTION_' . $key,
        'key' => $key, 'value' => $value,
        'source' => array_key_exists($key, $overrides) ? 'probe_override' : 'connector_default'];
}
echo json_encode(['no_connection_attempted' => true, 'effective_params' => $rows],
    JSON_PRETTY_PRINT) . PHP_EOL;
