<?php

declare(strict_types=1);

// Matched ISO package, isolated CLI only. Read-only AI connection + DPI map/hash gate.
$phase = 'preflight';
try {
    $mode = (string) getenv('CDX_MATCHED_MODE');
    $base = realpath((string) getenv('CDX_MATCHED_DIR'));
    if (!in_array($mode, ['statement', 'framework'], true)
        || !$base || strpos($base, '/tmp/zhct-dm-matched-probe.') !== 0
        || !defined('PDO::EXTRA_DECIMAL')) {
        throw new RuntimeException('Approved isolated matched package required');
    }
    foreach (['HOST', 'PORT', 'SCHEMA', 'USER', 'PASSWORD'] as $part) {
        if ((string) getenv('POC_AI_' . $part) === '') {
            throw new RuntimeException('Approved AI runtime environment required');
        }
    }
    $phase = 'connection';
    $dsn = 'dm:host=' . getenv('POC_AI_HOST') . ';port=' . getenv('POC_AI_PORT')
        . ';schema=' . getenv('POC_AI_SCHEMA');
    $pdo = new PDO($dsn, (string) getenv('POC_AI_USER'),
        (string) getenv('POC_AI_PASSWORD'), [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_STRINGIFY_FETCHES => true,
            PDO::EXTRA_DECIMAL => 1,
            PDO::ATTR_EMULATE_PREPARES => false,
        ]);
    $pdo->query('SELECT 1 AS SYNTHETIC_VALUE FROM DUAL')->fetch(PDO::FETCH_ASSOC);
    $phase = 'dpi_map';
    $paths = [];
    foreach (file('/proc/self/maps', FILE_IGNORE_NEW_LINES) ?: [] as $line) {
        if (strpos($line, 'libdmdpi.so') === false) {
            continue;
        }
        if (preg_match('~\s(/[^ ]*libdmdpi\.so)(?:\s|$)~', $line, $match)) {
            $paths[realpath($match[1]) ?: $match[1]] = true;
        }
    }
    $expectedPath = realpath($base . '/libdmdpi.so');
    $expectedHash = '86c2f1051616865082e1fe10071b2b70150e4ebfd10d7a71a5df22c928dcfcd5';
    if (!$expectedPath || count($paths) !== 1 || !isset($paths[$expectedPath])
        || hash_file('sha256', $expectedPath) !== $expectedHash) {
        throw new RuntimeException('Matched DPI mapping/hash mismatch');
    }
    echo 'DPI_MAP_OK ' . $expectedPath . ' SHA256=' . $expectedHash . PHP_EOL;
    $pdo = null;
    $phase = 'probe';
    if ($mode === 'statement') {
        foreach (['HOST', 'PORT', 'SCHEMA', 'USER', 'PASSWORD'] as $part) {
            putenv('POC_' . $part . '=' . getenv('POC_AI_' . $part));
        }
        require $base . '/prototype/StatementProbe.php';
    } else {
        putenv('POC_FRAMEWORK=ai_api');
        putenv('POC_APP_ROOT=/tmp/zhct-dm-poc-20260928.fcpiiN/ai_api');
        require $base . '/prototype/FrameworkProbe.php';
    }
} catch (Throwable $error) {
    // Exception messages and connection settings are deliberately omitted.
    echo json_encode(['status' => 'fail', 'phase' => $phase,
        'error_class' => get_class($error), 'error_code' => $error->getCode()]) . PHP_EOL;
    exit(1);
}
