<?php

declare(strict_types=1);

// Read-only probe for a user-supplied archived PHP database config. The source
// is tokenized as text, never evaluated, and credentials are never printed.
$source = stream_get_contents(STDIN);
if (!is_string($source) || strlen($source) > 65536) exit(2);
$pattern = <<<'REGEX'
/'(hostname|database|username|password)'\s*=>\s*'((?:\\.|[^'\\])*)'/s
REGEX;
preg_match_all($pattern, $source, $matches, PREG_SET_ORDER);
$groups = [];
$current = [];
foreach ($matches as $match) {
    $key = $match[1];
    if ($key === 'hostname' && $current) {
        $groups[] = $current;
        $current = [];
    }
    if (strpos($match[2], '\\') !== false) {
        throw new RuntimeException('Escaped credential literal requires manual review');
    }
    $current[$key] = $match[2];
}
if ($current) $groups[] = $current;
if (count($groups) !== 2) {
    throw new RuntimeException('Expected exactly two literal business connections');
}
$complete = [];
foreach ($groups as $group) {
    $valid = true;
    foreach (['hostname', 'database', 'username', 'password'] as $key) {
        if (!isset($group[$key]) || $group[$key] === '') {
            $valid = false;
        }
    }
    $complete[] = $valid;
}
if (getenv('POC_CONNECT') !== '1') {
    echo json_encode(['literal_connections_parsed' => count($groups),
        'complete_literal_connections' => $complete,
        'credentials_not_printed' => true, 'connection_attempted' => false]) . PHP_EOL;
    exit;
}

foreach (['store', 'ai_api'] as $index => $role) {
    if (!$complete[$index]) {
        echo json_encode(['role' => $role, 'connected' => false,
            'reason' => 'archived_literal_connection_incomplete']) . PHP_EOL;
        continue;
    }
    $config = $groups[$index];
    try {
        $pdo = new PDO('mysql:host=' . $config['hostname'] . ';port=3306;dbname='
            . $config['database'] . ';charset=utf8', $config['username'], $config['password'], [
                PDO::ATTR_TIMEOUT => 5,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            ]);
        $session = $pdo->query('SELECT VERSION() AS VERSION, DATABASE() AS DB_NAME,'
            . ' @@character_set_server AS SERVER_CHARSET,'
            . ' @@character_set_database AS DATABASE_CHARSET,'
            . ' @@character_set_connection AS PROBE_CONNECTION_CHARSET')
            ->fetch(PDO::FETCH_ASSOC);
        $schema = $pdo->prepare('SELECT DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME'
            . ' FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME=?');
        $schema->execute([$config['database']]);
        $schemaInfo = $schema->fetch(PDO::FETCH_ASSOC) ?: [];
        $columns = $pdo->prepare('SELECT CHARACTER_SET_NAME,COUNT(*) AS N'
            . ' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=?'
            . ' AND CHARACTER_SET_NAME IS NOT NULL GROUP BY CHARACTER_SET_NAME');
        $columns->execute([$config['database']]);
        $columnCounts = [];
        foreach ($columns->fetchAll(PDO::FETCH_ASSOC) as $row) {
            $columnCounts[$row['CHARACTER_SET_NAME']] = (int)$row['N'];
        }
        $tables = $pdo->prepare('SELECT TABLE_COLLATION,COUNT(*) AS N'
            . ' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?'
            . ' AND TABLE_TYPE=? GROUP BY TABLE_COLLATION');
        $tables->execute([$config['database'], 'BASE TABLE']);
        $tableCounts = [];
        foreach ($tables->fetchAll(PDO::FETCH_ASSOC) as $row) {
            $tableCounts[$row['TABLE_COLLATION']] = (int)$row['N'];
        }
        echo json_encode(['role' => $role, 'connected' => true,
            'version' => $session['VERSION'],
            'schema_matches_archived_config' => $session['DB_NAME'] === $config['database'],
            'server_charset' => $session['SERVER_CHARSET'],
            'database_charset' => $session['DATABASE_CHARSET'],
            'schema_default_charset' => $schemaInfo['DEFAULT_CHARACTER_SET_NAME'] ?? null,
            'schema_default_collation' => $schemaInfo['DEFAULT_COLLATION_NAME'] ?? null,
            'diagnostic_connection_charset' => $session['PROBE_CONNECTION_CHARSET'],
            'text_column_charsets' => $columnCounts,
            'table_default_collations' => $tableCounts], JSON_UNESCAPED_UNICODE) . PHP_EOL;
    } catch (PDOException $error) {
        echo json_encode(['role' => $role, 'connected' => false,
            'sqlstate' => (string)$error->getCode(),
            'driver_code' => $error->errorInfo[1] ?? null]) . PHP_EOL;
    }
}
