<?php
declare(strict_types=1);

// Isolated SELECT-only discriminator: prior three-statement PDO probe plus
// precisely one inherited Think ORM option, ATTR_ORACLE_NULLS=NULL_NATURAL.
$phase = 'preflight';
try {
    if (PHP_VERSION_ID !== 70433 || !defined('PDO::EXTRA_DECIMAL')) {
        throw new RuntimeException('Expected isolated PHP 7.4.33 candidate');
    }
    foreach (['HOST', 'PORT', 'SCHEMA', 'USER', 'PASSWORD'] as $part) {
        if ((string)getenv('POC_AI_' . $part) === '') {
            throw new RuntimeException('Approved AI environment missing');
        }
    }
    if (!in_array((string)getenv('POC_AI_HOST'), ['127.0.0.1', 'localhost'], true)
        || getenv('POC_AI_PORT') !== '5238'
        || getenv('POC_AI_SCHEMA') !== 'AIZHCT_APP') {
        throw new RuntimeException('Only loopback non-production AI 5238 is allowed');
    }
    $dsn = 'dm:host=' . getenv('POC_AI_HOST') . ';port=5238;schema=AIZHCT_APP';
    $pdo = new PDO($dsn, (string)getenv('POC_AI_USER'), (string)getenv('POC_AI_PASSWORD'), [
        PDO::ATTR_CASE => PDO::CASE_LOWER,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
        PDO::ATTR_STRINGIFY_FETCHES => true,
        PDO::EXTRA_DECIMAL => 1,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ]);
    $raw = "SELECT 7 AS I,CAST('9007199254740993.01' AS DECIMAL(30,2)) AS D,"
        . "CAST('0.00' AS DECIMAL(5,2)) AS Z FROM DUAL";
    $queries = [
        'query' => [$raw, []],
        'find' => ['SELECT * FROM (' . $raw
            . ') EXACT_Q WHERE  i = :ThinkBind_1_166812837_ LIMIT 1  ',
            [[':ThinkBind_1_166812837_', 7, PDO::PARAM_STR]]],
        'select' => ['SELECT * FROM (' . $raw . ') EXACT_Q ', []],
    ];
    foreach ($queries as $phase => $entry) {
        fwrite(STDERR, 'PDO_NULLS_BEGIN ' . $phase . PHP_EOL);
        $statement = $pdo->prepare($entry[0]);
        foreach ($entry[1] as $bind) {
            $statement->bindValue($bind[0], $bind[1], $bind[2]);
        }
        $statement->execute();
        $rows = $statement->fetchAll(PDO::FETCH_ASSOC);
        $row = $rows[0] ?? [];
        if (count($rows) !== 1 || $row !== [
            'i' => '7', 'd' => '9007199254740993.01', 'z' => '0.00',
        ]) {
            throw new RuntimeException('Synthetic result differs');
        }
        $types = array_map('gettype', $row);
        fwrite(STDERR, 'PDO_NULLS_DONE ' . $phase . ' types=' . json_encode($types) . PHP_EOL);
    }
    echo json_encode(['mode' => 'pdo_paired_with_oracle_nulls', 'php' => PHP_VERSION,
        'status' => 'pass', 'business_writes' => 0]) . PHP_EOL;
} catch (Throwable $error) {
    echo json_encode(['mode' => 'pdo_paired_with_oracle_nulls', 'php' => PHP_VERSION,
        'status' => 'fail', 'phase' => $phase, 'class' => get_class($error),
        'code' => $error->getCode()]) . PHP_EOL;
    exit(1);
}
