<?php
declare(strict_types=1);

// Read-only metadata check against the Store development connection only.
set_exception_handler(static function (Throwable $error): void {
    fwrite(STDERR, 'FK_METADATA_CHECK_FAILED ' . get_class($error)
        . ' code=' . (string)$error->getCode() . PHP_EOL);
    exit(2);
});
$configPath = realpath(__DIR__ . '/../../../../../zhctproject/store/application/config/local/database.php');
if ($configPath === false || strpos($configPath, '/zhctproject/store/application/config/local/') === false) {
    throw new RuntimeException('Store local development config unavailable');
}
$config = require $configPath;
if (isset($config['type']) && $config['type'] !== 'mysql') {
    throw new RuntimeException('Expected local MySQL configuration');
}
$pdo = new PDO(
    sprintf('mysql:host=%s;port=%d;dbname=%s;charset=utf8mb4',
        $config['hostname'], (int)($config['hostport'] ?? 3306), $config['database']),
    $config['username'], $config['password'],
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
     PDO::ATTR_EMULATE_PREPARES => false,
     PDO::ATTR_TIMEOUT => 8]
);
$version = (string)$pdo->query('SELECT VERSION()')->fetchColumn();
if (strpos($version, '5.6.') !== 0) {
    throw new RuntimeException('Expected MySQL 5.6 development server');
}
$statement = $pdo->prepare(
    'SELECT REFERENCED_TABLE_NAME,COUNT(DISTINCT CONCAT(TABLE_SCHEMA,CHAR(0),TABLE_NAME,CHAR(0),CONSTRAINT_NAME)) AS N'
    . ' FROM information_schema.KEY_COLUMN_USAGE'
    . ' WHERE REFERENCED_TABLE_SCHEMA=?'
    . ' AND REFERENCED_TABLE_NAME IN (?,?,?,?)'
    . ' GROUP BY REFERENCED_TABLE_NAME ORDER BY REFERENCED_TABLE_NAME'
);
$statement->execute([$config['database'], 'ydy_member_weight', 'ydy_nutrition_cupboard',
    'ydy_user_data', 'ydy_staff_department']);
$counts = array_fill_keys(['ydy_member_weight', 'ydy_nutrition_cupboard',
    'ydy_user_data', 'ydy_staff_department'], 0);
foreach ($statement->fetchAll(PDO::FETCH_ASSOC) as $row) {
    $counts[$row['REFERENCED_TABLE_NAME']] = (int)$row['N'];
}
echo json_encode(['target' => 'store-local-mysql56', 'incoming_fk_counts' => $counts],
    JSON_UNESCAPED_SLASHES), PHP_EOL;
