<?php

declare(strict_types=1);

// Counts only. No usernames, UUIDs, token contents, or existing log rows emitted.
$engine = (string) getenv('CDX_AGENT_SCHEMA_ENGINE');
if (!in_array($engine, ['mysql', 'dm'], true)) {
    fwrite(STDERR, "Explicit mysql or dm required\n");
    exit(2);
}
try {
    if ($engine === 'mysql') {
        $path = realpath(__DIR__
            . '/../../../../../zhctproject/store/application/config/local/database.php');
        if (!$path) {
            throw new RuntimeException('Local config unavailable');
        }
        $config = require $path;
        $dsn = 'mysql:host=' . $config['hostname'] . ';port='
            . (int) ($config['hostport'] ?? 3306) . ';dbname='
            . $config['database'] . ';charset=utf8mb4';
        $pdo = new PDO($dsn, (string) $config['username'],
            (string) $config['password'], [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES => false,
                PDO::ATTR_TIMEOUT => 8,
            ]);
        $prefix = 'ydy_';
    } else {
        foreach (['POC_HOST', 'POC_PORT', 'POC_SCHEMA', 'POC_USER', 'POC_PASSWORD'] as $key) {
            if ((string) getenv($key) === '') {
                throw new RuntimeException('Approved DM runtime unavailable');
            }
        }
        $dsn = 'dm:host=' . getenv('POC_HOST') . ';port='
            . getenv('POC_PORT') . ';schema=' . getenv('POC_SCHEMA');
        $pdo = new PDO($dsn, (string) getenv('POC_USER'),
            (string) getenv('POC_PASSWORD'), [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES => false,
            ]);
        $prefix = 'YDY_';
    }
    $table = static function (string $name) use ($prefix, $engine): string {
        return $prefix . ($engine === 'dm' ? strtoupper($name) : $name);
    };
    $menuUuid = 'A1144000-0000-0000-0000-000000000003';
    $menu = $pdo->prepare('SELECT COUNT(*) FROM ' . $table('menu')
        . ' WHERE UUID=? AND LOWER(FILTER) LIKE ?');
    $menu->execute([$menuUuid, '%p/agentconversationlog/lists%']);
    $menuCount = (int) $menu->fetchColumn();

    $users = $pdo->prepare('SELECT COUNT(*) FROM ' . $table('user')
        . " WHERE ACCOUNT LIKE 'CDXPARAGENT%' AND TYPE=1 AND IS_DELETE=0");
    $users->execute();
    $userCount = (int) $users->fetchColumn();

    $grants = $pdo->prepare('SELECT COUNT(*) FROM ' . $table('user') . ' u'
        . ' JOIN ' . $table('user_role') . ' ur ON ur.USER_UUID=u.UUID'
        . ' JOIN ' . $table('role_menu') . ' rm ON rm.ROLE_UUID=ur.ROLE_UUID'
        . ' JOIN ' . $table('menu') . ' m ON m.UUID=rm.MENU_UUID'
        . " WHERE u.ACCOUNT LIKE 'CDXPARAGENT%' AND u.TYPE=1"
        . ' AND u.IS_DELETE=0 AND m.UUID=?');
    $grants->execute([$menuUuid]);
    $grantCount = (int) $grants->fetchColumn();
    echo json_encode(['engine' => $engine,
        'menu_exact_uuid_filter_count' => $menuCount,
        'synthetic_ordinary_user_count' => $userCount,
        'synthetic_role_menu_link_count' => $grantCount,
        'token_available' => false], JSON_PRETTY_PRINT) . PHP_EOL;
} catch (Throwable $error) {
    echo json_encode(['engine' => $engine, 'status' => 'error',
        'class' => get_class($error), 'code' => $error->getCode()]) . PHP_EOL;
    exit(1);
}
