<?php

declare(strict_types=1);

// Synthetic SELECT-only diagnosis for the isolated AI framework probe.
require __DIR__ . '/exact-fetch-prototype/ExactStatement.php';
$root = realpath((string) getenv('POC_APP_ROOT'));
if (!$root || strpos($root, '/tmp/zhct-') !== 0 || !defined('PDO::EXTRA_DECIMAL')) {
    throw new RuntimeException('Isolated candidate runtime required');
}
foreach (['HOST', 'PORT', 'SCHEMA', 'USER', 'PASSWORD'] as $part) {
    if ((string) getenv('POC_AI_' . $part) === '') {
        throw new RuntimeException('Approved AI runtime environment required');
    }
}
require $root . '/vendor/autoload.php';
$config = [
    'type' => \app\common\database\Dm::class,
    'hostname' => getenv('POC_AI_HOST'),
    'hostport' => (int) getenv('POC_AI_PORT'),
    'database' => getenv('POC_AI_SCHEMA'),
    'username' => getenv('POC_AI_USER'),
    'password' => getenv('POC_AI_PASSWORD'),
    'prefix' => '',
    'debug' => false,
    'params' => [
        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_STATEMENT_CLASS => [ExactStatement::class, []],
        PDO::ATTR_EMULATE_PREPARES => false,
    ],
];
$manager = new \think\DbManager();
$manager->setConfig(['default' => 'probe', 'connections' => ['probe' => $config]]);
$db = $manager->connect('probe');
$sql = "SELECT 7 AS I,CAST('9007199254740993.01' AS DECIMAL(30,2)) AS D,"
    . "CAST('0.00' AS DECIMAL(5,2)) AS Z FROM DUAL";
$table = '(' . $sql . ') EXACT_Q';
$results = [];
foreach (['query', 'find', 'select', 'value', 'column', 'count'] as $case) {
    try {
        switch ($case) {
            case 'query': $actual = $db->query($sql); break;
            case 'find': $actual = $db->table($table)->find(); break;
            case 'select': $actual = $db->table($table)->select(); break;
            case 'value': $actual = $db->table($table)->value('d'); break;
            case 'column': $actual = $db->table($table)->column('d'); break;
            default: $actual = $db->table($table)->count(); break;
        }
        $results[$case] = [
            'type' => gettype($actual),
            'class' => is_object($actual) ? get_class($actual) : null,
            'value' => is_object($actual) && method_exists($actual, 'toArray')
                ? $actual->toArray() : $actual,
        ];
    } catch (Throwable $error) {
        $results[$case] = ['error_class' => get_class($error), 'error_code' => $error->getCode()];
    }
}
echo json_encode(['php' => PHP_VERSION, 'cases' => $results], JSON_PRETTY_PRINT) . PHP_EOL;
