<?php
declare(strict_types=1);

/**
 * /admin/coins/
 *
 * Відповідає за:
 * - адмін-сторінку зведення по VM Coins
 * - SEO-безпечний службовий endpoint (noindex, nofollow, noarchive)
 * - перегляд стану схеми VM Coins
 * - коротке зведення по користувачах, балансах і транзакціях
 * - денну аналітику reward-транзакцій
 * - статистику промокодів / рефералів
 * - показ останніх транзакцій
 * - пагінацію транзакцій по 10 на сторінку
 *
 * ВАЖЛИВО:
 * - налаштування винесені в /admin/coins/settings.php
 * - ручне коригування винесене в /admin/coins/adjust.php
 */

require_once __DIR__ . '/../../includes/start.php';
require_once __DIR__ . '/../_helpers.php';
require_once __DIR__ . '/../_sidebar.php';

$__vmCoinsLib = __DIR__ . '/../../functional/VMCoins/_lib.php';
if (is_file($__vmCoinsLib)) {
    require_once $__vmCoinsLib;
}
unset($__vmCoinsLib);

if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    header('Cache-Control: no-store, max-age=0', true);
    header('Pragma: no-cache', true);
}

require_login();

$pdo = isset($pdo) && $pdo instanceof PDO ? $pdo : db();
$me  = isset($me) && is_array($me) ? $me : current_user();

if (function_exists('require_role')) {
    require_role(['admin']);
} else {
    $role = (string)($me['role'] ?? '');
    if ($role !== 'admin') {
        http_response_code(403);
        exit('Forbidden');
    }
}

if (!function_exists('e')) {
    function e($v): string
    {
        return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
    }
}

if (!function_exists('admin_coins_t')) {
    function admin_coins_t(string $uk, string $ru, string $en): string
    {
        $lang = function_exists('lang') ? (string)lang() : (string)($_SESSION['lang'] ?? 'uk');
        if (!in_array($lang, ['uk', 'ru', 'en'], true)) {
            $lang = 'uk';
        }

        return match ($lang) {
            'ru' => $ru,
            'en' => $en,
            default => $uk,
        };
    }
}

if (!function_exists('admin_coins_db_has_table')) {
    function admin_coins_db_has_table(PDO $pdo, string $table): bool
    {
        if (!preg_match('/^[a-zA-Z0-9_]+$/', $table)) {
            return false;
        }

        if (function_exists('db_has_table')) {
            try {
                return (bool)db_has_table($pdo, $table);
            } catch (Throwable $e) {
            }
        }

        try {
            $st = $pdo->prepare("
                SELECT 1
                FROM information_schema.tables
                WHERE table_schema = DATABASE()
                  AND table_name = ?
                LIMIT 1
            ");
            $st->execute([$table]);
            return (bool)$st->fetchColumn();
        } catch (Throwable $e) {
            return false;
        }
    }
}

if (!function_exists('admin_coins_db_has_column')) {
    function admin_coins_db_has_column(PDO $pdo, string $table, string $column): bool
    {
        if (!preg_match('/^[a-zA-Z0-9_]+$/', $table) || !preg_match('/^[a-zA-Z0-9_]+$/', $column)) {
            return false;
        }

        if (function_exists('db_has_column')) {
            try {
                return (bool)db_has_column($pdo, $table, $column);
            } catch (Throwable $e) {
            }
        }

        try {
            $st = $pdo->prepare("
                SELECT 1
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                  AND table_name = ?
                  AND column_name = ?
                LIMIT 1
            ");
            $st->execute([$table, $column]);
            return (bool)$st->fetchColumn();
        } catch (Throwable $e) {
            return false;
        }
    }
}

if (!function_exists('admin_coins_num')) {
    function admin_coins_num($n): string
    {
        return number_format((float)$n, 0, '.', ' ');
    }
}

if (!function_exists('admin_coins_get_int_query')) {
    function admin_coins_get_int_query(string $key, int $default = 1, int $min = 1, int $max = 100000): int
    {
        $raw = $_GET[$key] ?? $default;
        $val = is_numeric((string)$raw) ? (int)$raw : $default;
        if ($val < $min) $val = $min;
        if ($val > $max) $val = $max;
        return $val;
    }
}

if (!function_exists('admin_coins_section_help')) {
    function admin_coins_section_help(string $section): string
    {
        return match ($section) {
            'stats' => admin_coins_t(
                'Коротке зведення по користувачах, балансах і загальній кількості операцій.',
                'Краткая сводка по пользователям, балансам и общему числу операций.',
                'A short summary of users, balances, and total transaction volume.'
            ),
            'today' => admin_coins_t(
                'Показує, що система нарахувала сьогодні за пости та коментарі.',
                'Показывает, что система начислила сегодня за посты и комментарии.',
                'Shows what the system rewarded today for posts and comments.'
            ),
            'referrals' => admin_coins_t(
                'Зведення по промокодах: скільки кодів існує, скільки їх використали і скільки було реферальних операцій.',
                'Сводка по промокодам: сколько кодов существует, сколько их использовали и сколько было реферальных операций.',
                'Summary of promo codes: how many exist, how many were used, and how many referral transactions were made.'
            ),
            'recent_transactions' => admin_coins_t(
                'Останні записи журналу змін балансу з типом події, сумою і фінальним балансом.',
                'Последние записи журнала изменений баланса с типом события, суммой и финальным балансом.',
                'Recent balance change records with event type, amount, and resulting balance.'
            ),
            default => '',
        };
    }
}

if (!function_exists('admin_coins_enabled_value')) {
    function admin_coins_enabled_value(PDO $pdo): int
    {
        if (function_exists('vmc_setting_int')) {
            try {
                return (int)vmc_setting_int($pdo, 'vmcoins_enabled', 0);
            } catch (Throwable $e) {
            }
        }

        if (!admin_coins_db_has_table($pdo, 'app_settings')) {
            return 0;
        }

        try {
            $st = $pdo->prepare("SELECT value_text FROM app_settings WHERE key_name = 'vmcoins_enabled' LIMIT 1");
            $st->execute();
            $v = $st->fetchColumn();
            return $v === false ? 0 : (int)$v;
        } catch (Throwable $e) {
            return 0;
        }
    }
}

if (!function_exists('admin_coins_schema_warnings')) {
    function admin_coins_schema_warnings(PDO $pdo): array
    {
        $warnings = [];

        if (!admin_coins_db_has_table($pdo, 'app_settings')) {
            $warnings[] = admin_coins_t(
                'Немає таблиці app_settings.',
                'Нет таблицы app_settings.',
                'The app_settings table is missing.'
            );
        }

        if (!admin_coins_db_has_table($pdo, 'vm_coin_transactions')) {
            $warnings[] = admin_coins_t(
                'Немає таблиці vm_coin_transactions.',
                'Нет таблицы vm_coin_transactions.',
                'The vm_coin_transactions table is missing.'
            );
        }

        $needCols = [
            'vm_coins_balance',
            'vm_coins_earned_total',
            'vm_coins_spent_total',
            'vm_coins_updated_at',
        ];

        foreach ($needCols as $col) {
            if (!admin_coins_db_has_column($pdo, 'users', $col)) {
                $warnings[] = admin_coins_t(
                    'У таблиці users немає колонки: ',
                    'В таблице users нет колонки: ',
                    'The users table is missing column: '
                ) . $col;
            }
        }

        foreach (['vm_ref_code', 'vm_referred_by_user_id', 'vm_ref_applied_at'] as $col) {
            if (!admin_coins_db_has_column($pdo, 'users', $col)) {
                $warnings[] = admin_coins_t(
                    'У таблиці users немає колонки: ',
                    'В таблице users нет колонки: ',
                    'The users table is missing column: '
                ) . $col;
            }
        }

        return $warnings;
    }
}

if (!function_exists('admin_coins_load_stats')) {
    function admin_coins_load_stats(PDO $pdo): array
    {
        $stats = [
            'users_total' => 0,
            'users_non_zero' => 0,
            'total_balance' => 0,
            'total_earned' => 0,
            'total_spent' => 0,
            'tx_total' => 0,
            'tx_positive' => 0,
            'tx_negative' => 0,
            'last_tx_at' => '',
        ];

        $hasUserCols =
            admin_coins_db_has_column($pdo, 'users', 'vm_coins_balance') &&
            admin_coins_db_has_column($pdo, 'users', 'vm_coins_earned_total') &&
            admin_coins_db_has_column($pdo, 'users', 'vm_coins_spent_total');

        if ($hasUserCols) {
            try {
                $row = $pdo->query("
                    SELECT
                        COUNT(*) AS users_total,
                        SUM(CASE WHEN vm_coins_balance <> 0 THEN 1 ELSE 0 END) AS users_non_zero,
                        COALESCE(SUM(vm_coins_balance), 0) AS total_balance,
                        COALESCE(SUM(vm_coins_earned_total), 0) AS total_earned,
                        COALESCE(SUM(vm_coins_spent_total), 0) AS total_spent
                    FROM users
                ")->fetch(PDO::FETCH_ASSOC) ?: [];

                $stats['users_total']    = (int)($row['users_total'] ?? 0);
                $stats['users_non_zero'] = (int)($row['users_non_zero'] ?? 0);
                $stats['total_balance']  = (int)($row['total_balance'] ?? 0);
                $stats['total_earned']   = (int)($row['total_earned'] ?? 0);
                $stats['total_spent']    = (int)($row['total_spent'] ?? 0);
            } catch (Throwable $e) {
                error_log('admin/coins/index.php user stats error: ' . $e->getMessage());
            }
        }

        if (admin_coins_db_has_table($pdo, 'vm_coin_transactions')) {
            try {
                $row = $pdo->query("
                    SELECT
                        COUNT(*) AS tx_total,
                        SUM(CASE WHEN delta_amount > 0 THEN 1 ELSE 0 END) AS tx_positive,
                        SUM(CASE WHEN delta_amount < 0 THEN 1 ELSE 0 END) AS tx_negative,
                        MAX(created_at) AS last_tx_at
                    FROM vm_coin_transactions
                ")->fetch(PDO::FETCH_ASSOC) ?: [];

                $stats['tx_total']    = (int)($row['tx_total'] ?? 0);
                $stats['tx_positive'] = (int)($row['tx_positive'] ?? 0);
                $stats['tx_negative'] = (int)($row['tx_negative'] ?? 0);
                $stats['last_tx_at']  = (string)($row['last_tx_at'] ?? '');
            } catch (Throwable $e) {
                error_log('admin/coins/index.php tx stats error: ' . $e->getMessage());
            }
        }

        return $stats;
    }
}

if (!function_exists('admin_coins_load_creation_stats')) {
    function admin_coins_load_creation_stats(PDO $pdo): array
    {
        $out = [
            'today_post_count' => 0,
            'today_post_sum' => 0,
            'today_comment_count' => 0,
            'today_comment_sum' => 0,
            'today_rewarded_users' => 0,
        ];

        if (!admin_coins_db_has_table($pdo, 'vm_coin_transactions')) {
            return $out;
        }

        try {
            $st = $pdo->prepare("
                SELECT
                    SUM(CASE WHEN event_key = 'post_create' THEN 1 ELSE 0 END) AS today_post_count,
                    COALESCE(SUM(CASE WHEN event_key = 'post_create' THEN delta_amount ELSE 0 END), 0) AS today_post_sum,
                    SUM(CASE WHEN event_key = 'comment_create' THEN 1 ELSE 0 END) AS today_comment_count,
                    COALESCE(SUM(CASE WHEN event_key = 'comment_create' THEN delta_amount ELSE 0 END), 0) AS today_comment_sum,
                    COUNT(DISTINCT user_id) AS today_rewarded_users
                FROM vm_coin_transactions
                WHERE event_key IN ('post_create', 'comment_create')
                  AND created_at >= CURDATE()
                  AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
            ");
            $st->execute();
            $row = $st->fetch(PDO::FETCH_ASSOC) ?: [];

            $out['today_post_count']     = (int)($row['today_post_count'] ?? 0);
            $out['today_post_sum']       = (int)($row['today_post_sum'] ?? 0);
            $out['today_comment_count']  = (int)($row['today_comment_count'] ?? 0);
            $out['today_comment_sum']    = (int)($row['today_comment_sum'] ?? 0);
            $out['today_rewarded_users'] = (int)($row['today_rewarded_users'] ?? 0);
        } catch (Throwable $e) {
            error_log('admin/coins/index.php creation stats error: ' . $e->getMessage());
        }

        return $out;
    }
}

if (!function_exists('admin_coins_load_referral_stats')) {
    function admin_coins_load_referral_stats(PDO $pdo): array
    {
        $out = [
            'users_with_codes' => 0,
            'users_with_referrer' => 0,
            'distinct_referrers' => 0,
            'referral_tx_count' => 0,
            'referral_tx_sum' => 0,
        ];

        $hasRefCols =
            admin_coins_db_has_column($pdo, 'users', 'vm_ref_code') &&
            admin_coins_db_has_column($pdo, 'users', 'vm_referred_by_user_id') &&
            admin_coins_db_has_column($pdo, 'users', 'vm_ref_applied_at');

        if ($hasRefCols) {
            try {
                $row = $pdo->query("
                    SELECT
                        SUM(CASE WHEN vm_ref_code IS NOT NULL AND vm_ref_code <> '' THEN 1 ELSE 0 END) AS users_with_codes,
                        SUM(CASE WHEN vm_referred_by_user_id IS NOT NULL AND vm_referred_by_user_id > 0 THEN 1 ELSE 0 END) AS users_with_referrer,
                        COUNT(DISTINCT CASE WHEN vm_referred_by_user_id IS NOT NULL AND vm_referred_by_user_id > 0 THEN vm_referred_by_user_id END) AS distinct_referrers
                    FROM users
                ")->fetch(PDO::FETCH_ASSOC) ?: [];

                $out['users_with_codes']    = (int)($row['users_with_codes'] ?? 0);
                $out['users_with_referrer'] = (int)($row['users_with_referrer'] ?? 0);
                $out['distinct_referrers']  = (int)($row['distinct_referrers'] ?? 0);
            } catch (Throwable $e) {
                error_log('admin/coins/index.php referral stats users error: ' . $e->getMessage());
            }
        }

        if (admin_coins_db_has_table($pdo, 'vm_coin_transactions')) {
            try {
                $st = $pdo->prepare("
                    SELECT
                        COUNT(*) AS referral_tx_count,
                        COALESCE(SUM(delta_amount), 0) AS referral_tx_sum
                    FROM vm_coin_transactions
                    WHERE event_key IN ('referral_bonus_referrer', 'referral_bonus_referred')
                ");
                $st->execute();
                $row = $st->fetch(PDO::FETCH_ASSOC) ?: [];

                $out['referral_tx_count'] = (int)($row['referral_tx_count'] ?? 0);
                $out['referral_tx_sum']   = (int)($row['referral_tx_sum'] ?? 0);
            } catch (Throwable $e) {
                error_log('admin/coins/index.php referral stats tx error: ' . $e->getMessage());
            }
        }

        return $out;
    }
}

if (!function_exists('admin_coins_count_transactions')) {
    function admin_coins_count_transactions(PDO $pdo): int
    {
        if (!admin_coins_db_has_table($pdo, 'vm_coin_transactions')) {
            return 0;
        }

        try {
            $st = $pdo->query("SELECT COUNT(*) FROM vm_coin_transactions");
            return (int)$st->fetchColumn();
        } catch (Throwable $e) {
            error_log('admin/coins/index.php tx count error: ' . $e->getMessage());
            return 0;
        }
    }
}

if (!function_exists('admin_coins_load_recent_transactions')) {
    function admin_coins_load_recent_transactions(PDO $pdo, int $limit = 10, int $offset = 0): array
    {
        if (!admin_coins_db_has_table($pdo, 'vm_coin_transactions')) {
            return [];
        }

        $limit  = max(1, min(100, $limit));
        $offset = max(0, $offset);

        $hasUsers = admin_coins_db_has_table($pdo, 'users');
        $hasUsername = $hasUsers && admin_coins_db_has_column($pdo, 'users', 'username');

        try {
            if ($hasUsername) {
                $sql = "
                    SELECT
                        t.id,
                        t.user_id,
                        u.username,
                        t.delta_amount,
                        t.balance_after,
                        t.event_key,
                        t.entity_type,
                        t.entity_id,
                        t.related_user_id,
                        ru.username AS related_username,
                        t.note,
                        t.meta_json,
                        t.created_at
                    FROM vm_coin_transactions t
                    LEFT JOIN users u ON u.id = t.user_id
                    LEFT JOIN users ru ON ru.id = t.related_user_id
                    ORDER BY t.id DESC
                    LIMIT {$limit} OFFSET {$offset}
                ";
            } else {
                $sql = "
                    SELECT
                        t.id,
                        t.user_id,
                        '' AS username,
                        t.delta_amount,
                        t.balance_after,
                        t.event_key,
                        t.entity_type,
                        t.entity_id,
                        t.related_user_id,
                        '' AS related_username,
                        t.note,
                        t.meta_json,
                        t.created_at
                    FROM vm_coin_transactions t
                    ORDER BY t.id DESC
                    LIMIT {$limit} OFFSET {$offset}
                ";
            }

            return $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC) ?: [];
        } catch (Throwable $e) {
            error_log('admin/coins/index.php recent transactions error: ' . $e->getMessage());
            return [];
        }
    }
}

if (!function_exists('admin_coins_event_label')) {
    function admin_coins_event_label(string $eventKey): string
    {
        return match ($eventKey) {
            'post_create' => admin_coins_t('Створення поста', 'Создание поста', 'Post creation'),
            'comment_create' => admin_coins_t('Створення коментаря', 'Создание комментария', 'Comment creation'),
            'post_reaction_adjust' => admin_coins_t('Реакція на пост', 'Реакция на пост', 'Post reaction'),
            'comment_reaction_adjust' => admin_coins_t('Реакція на коментар', 'Реакция на комментарий', 'Comment reaction'),
            'referral_bonus_referrer' => admin_coins_t('Бонус власнику промокоду', 'Бонус владельцу промокода', 'Promo code owner bonus'),
            'referral_bonus_referred' => admin_coins_t('Бонус за введення промокоду', 'Бонус за ввод промокода', 'Promo code apply bonus'),
            'admin_adjust' => admin_coins_t('Ручне коригування адміном', 'Ручная корректировка админом', 'Manual admin adjustment'),
            'user_transfer_out' => admin_coins_t('Переказ користувачу', 'Перевод пользователю', 'Transfer to user'),
            'user_transfer_in' => admin_coins_t('Отримання переказу', 'Получение перевода', 'Incoming transfer'),
            default => $eventKey,
        };
    }
}

if (!function_exists('admin_coins_pagination_url')) {
    function admin_coins_pagination_url(int $page): string
    {
        $params = $_GET;
        $params['page'] = $page;
        $query = http_build_query($params);
        return '/admin/coins/' . ($query !== '' ? ('?' . $query) : '');
    }
}

/* ===== view data ===== */
$page       = admin_coins_get_int_query('page', 1, 1, 100000);
$perPage    = 10;
$offset     = ($page - 1) * $perPage;
$enabledVal = admin_coins_enabled_value($pdo);

$schemaWarnings    = admin_coins_schema_warnings($pdo);
$stats             = admin_coins_load_stats($pdo);
$creationStats     = admin_coins_load_creation_stats($pdo);
$refStats          = admin_coins_load_referral_stats($pdo);
$totalTransactions = admin_coins_count_transactions($pdo);
$totalPages        = max(1, (int)ceil($totalTransactions / $perPage));
if ($page > $totalPages) {
    $page = $totalPages;
    $offset = ($page - 1) * $perPage;
}
$recentTransactions = admin_coins_load_recent_transactions($pdo, $perPage, $offset);

$title = admin_coins_t('VM Coins — зведення', 'VM Coins — сводка', 'VM Coins — Overview');

require_once __DIR__ . '/../../includes/header.php';
?>

<div class="container py-4">
    <div class="row g-4">
        <div class="col-lg-8">
            <div class="card card-app mb-4">
                <div class="card-body">
                    <div class="d-flex flex-wrap align-items-center justify-content-between gap-2 mb-3">
                        <div>
                            <h1 class="h3 mb-1"><?= e(admin_coins_t('VM Coins — зведення', 'VM Coins — сводка', 'VM Coins — Overview')) ?></h1>
                            <div class="text-muted">
                                <?= e(admin_coins_t(
                                    'Коротке зведення по балансах, активності модуля і останніх транзакціях.',
                                    'Краткая сводка по балансам, активности модуля и последним транзакциям.',
                                    'A compact summary of balances, module activity, and recent transactions.'
                                )) ?>
                            </div>
                        </div>
                        <div>
                            <span class="badge <?= ($enabledVal === 1) ? 'text-bg-success' : 'text-bg-secondary' ?>">
                                <?= e(($enabledVal === 1)
                                    ? admin_coins_t('Увімкнено', 'Включено', 'Enabled')
                                    : admin_coins_t('Вимкнено', 'Выключено', 'Disabled')) ?>
                            </span>
                        </div>
                    </div>

                    <?php if ($schemaWarnings): ?>
                        <div class="alert alert-warning mb-3">
                            <div class="fw-semibold mb-2">
                                <?= e(admin_coins_t(
                                    'Увага: схема VM Coins ще не повністю готова',
                                    'Внимание: схема VM Coins ещё не полностью готова',
                                    'Attention: the VM Coins schema is not fully ready yet'
                                )) ?>
                            </div>
                            <ul class="mb-0 ps-3">
                                <?php foreach ($schemaWarnings as $warn): ?>
                                    <li><?= e($warn) ?></li>
                                <?php endforeach; ?>
                            </ul>
                        </div>
                    <?php endif; ?>

                    <div class="mb-3 text-muted small">
                        <?= e(admin_coins_section_help('stats')) ?>
                    </div>

                    <div class="row g-3 mb-4">
                        <div class="col-sm-6 col-xl-3">
                            <div class="border rounded-3 p-3 h-100">
                                <div class="text-muted small mb-1"><?= e(admin_coins_t('Користувачів', 'Пользователей', 'Users')) ?></div>
                                <div class="h4 mb-0"><?= e(admin_coins_num($stats['users_total'])) ?></div>
                            </div>
                        </div>
                        <div class="col-sm-6 col-xl-3">
                            <div class="border rounded-3 p-3 h-100">
                                <div class="text-muted small mb-1"><?= e(admin_coins_t('З балансом ≠ 0', 'С балансом ≠ 0', 'With non-zero balance')) ?></div>
                                <div class="h4 mb-0"><?= e(admin_coins_num($stats['users_non_zero'])) ?></div>
                            </div>
                        </div>
                        <div class="col-sm-6 col-xl-3">
                            <div class="border rounded-3 p-3 h-100">
                                <div class="text-muted small mb-1"><?= e(admin_coins_t('Сума балансів', 'Сумма балансов', 'Total balances')) ?></div>
                                <div class="h4 mb-0"><?= e(admin_coins_num($stats['total_balance'])) ?></div>
                            </div>
                        </div>
                        <div class="col-sm-6 col-xl-3">
                            <div class="border rounded-3 p-3 h-100">
                                <div class="text-muted small mb-1"><?= e(admin_coins_t('Операцій', 'Операций', 'Transactions')) ?></div>
                                <div class="h4 mb-0"><?= e(admin_coins_num($stats['tx_total'])) ?></div>
                            </div>
                        </div>

                        <div class="col-sm-6 col-xl-4">
                            <div class="border rounded-3 p-3 h-100">
                                <div class="text-muted small mb-1"><?= e(admin_coins_t('Нараховано всього', 'Начислено всего', 'Total earned')) ?></div>
                                <div class="h5 mb-0">+<?= e(admin_coins_num($stats['total_earned'])) ?></div>
                            </div>
                        </div>
                        <div class="col-sm-6 col-xl-4">
                            <div class="border rounded-3 p-3 h-100">
                                <div class="text-muted small mb-1"><?= e(admin_coins_t('Списано всього', 'Списано всего', 'Total spent')) ?></div>
                                <div class="h5 mb-0">-<?= e(admin_coins_num($stats['total_spent'])) ?></div>
                            </div>
                        </div>
                        <div class="col-sm-12 col-xl-4">
                            <div class="border rounded-3 p-3 h-100">
                                <div class="text-muted small mb-1"><?= e(admin_coins_t('Остання транзакція', 'Последняя транзакция', 'Last transaction')) ?></div>
                                <div class="small fw-semibold">
                                    <?= e($stats['last_tx_at'] !== '' ? $stats['last_tx_at'] : admin_coins_t('Немає', 'Нет', 'None')) ?>
                                </div>
                            </div>
                        </div>
                    </div>

                    <div class="border rounded-3 p-3 mb-4">
                        <h2 class="h5 mb-2"><?= e(admin_coins_t('Сьогоднішня активність', 'Сегодняшняя активность', 'Today’s activity')) ?></h2>
                        <div class="text-muted small mb-3"><?= e(admin_coins_section_help('today')) ?></div>

                        <div class="row g-3">
                            <div class="col-sm-6 col-xl-3">
                                <div class="border rounded-3 p-3 h-100">
                                    <div class="text-muted small mb-1"><?= e(admin_coins_t('Оплачених постів сьогодні', 'Оплаченных постов сегодня', 'Rewarded posts today')) ?></div>
                                    <div class="h5 mb-0"><?= e(admin_coins_num($creationStats['today_post_count'])) ?></div>
                                    <div class="small text-muted mt-1">+<?= e(admin_coins_num($creationStats['today_post_sum'])) ?></div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-xl-3">
                                <div class="border rounded-3 p-3 h-100">
                                    <div class="text-muted small mb-1"><?= e(admin_coins_t('Оплачених коментарів сьогодні', 'Оплаченных комментариев сегодня', 'Rewarded comments today')) ?></div>
                                    <div class="h5 mb-0"><?= e(admin_coins_num($creationStats['today_comment_count'])) ?></div>
                                    <div class="small text-muted mt-1">+<?= e(admin_coins_num($creationStats['today_comment_sum'])) ?></div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-xl-3">
                                <div class="border rounded-3 p-3 h-100">
                                    <div class="text-muted small mb-1"><?= e(admin_coins_t('Користувачів з нагородами сьогодні', 'Пользователей с наградами сегодня', 'Rewarded users today')) ?></div>
                                    <div class="h5 mb-0"><?= e(admin_coins_num($creationStats['today_rewarded_users'])) ?></div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-xl-3">
                                <div class="border rounded-3 p-3 h-100">
                                    <div class="text-muted small mb-1"><?= e(admin_coins_t('Сумарно за пости+коментарі сьогодні', 'Суммарно за посты+комментарии сегодня', 'Total posts+comments rewarded today')) ?></div>
                                    <div class="h5 mb-0">
                                        +<?= e(admin_coins_num(
                                            (int)$creationStats['today_post_sum'] + (int)$creationStats['today_comment_sum']
                                        )) ?>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>

                    <div class="border rounded-3 p-3">
                        <h2 class="h5 mb-2"><?= e(admin_coins_t('Статистика промокодів', 'Статистика промокодов', 'Promo-code stats')) ?></h2>
                        <div class="text-muted small mb-3"><?= e(admin_coins_section_help('referrals')) ?></div>

                        <div class="row g-3">
                            <div class="col-sm-6 col-xl-3">
                                <div class="border rounded-3 p-3 h-100">
                                    <div class="text-muted small mb-1"><?= e(admin_coins_t('Користувачів з кодом', 'Пользователей с кодом', 'Users with code')) ?></div>
                                    <div class="h5 mb-0"><?= e(admin_coins_num($refStats['users_with_codes'])) ?></div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-xl-3">
                                <div class="border rounded-3 p-3 h-100">
                                    <div class="text-muted small mb-1"><?= e(admin_coins_t('Використали код', 'Использовали код', 'Applied a code')) ?></div>
                                    <div class="h5 mb-0"><?= e(admin_coins_num($refStats['users_with_referrer'])) ?></div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-xl-3">
                                <div class="border rounded-3 p-3 h-100">
                                    <div class="text-muted small mb-1"><?= e(admin_coins_t('Активних реферерів', 'Активных рефереров', 'Active referrers')) ?></div>
                                    <div class="h5 mb-0"><?= e(admin_coins_num($refStats['distinct_referrers'])) ?></div>
                                </div>
                            </div>
                            <div class="col-sm-6 col-xl-3">
                                <div class="border rounded-3 p-3 h-100">
                                    <div class="text-muted small mb-1"><?= e(admin_coins_t('Реферальних транзакцій', 'Реферальных транзакций', 'Referral transactions')) ?></div>
                                    <div class="h5 mb-0"><?= e(admin_coins_num($refStats['referral_tx_count'])) ?></div>
                                    <div class="small text-muted mt-1"><?= e(admin_coins_t('Сума', 'Сумма', 'Amount')) ?>: <?= e(admin_coins_num($refStats['referral_tx_sum'])) ?></div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="card card-app">
                <div class="card-body">
                    <div class="d-flex flex-wrap align-items-center justify-content-between gap-2 mb-2">
                        <h2 class="h5 mb-0"><?= e(admin_coins_t('Останні транзакції', 'Последние транзакции', 'Recent transactions')) ?></h2>
                        <div class="small text-muted">
                            <?= e(admin_coins_t('Сторінка', 'Страница', 'Page')) ?> <?= e((string)$page) ?>
                            / <?= e((string)$totalPages) ?>
                        </div>
                    </div>

                    <div class="text-muted small mb-3"><?= e(admin_coins_section_help('recent_transactions')) ?></div>

                    <?php if (!$recentTransactions): ?>
                        <div class="text-muted">
                            <?= e(admin_coins_t('Транзакцій поки немає або таблиця ще не створена.', 'Транзакций пока нет или таблица ещё не создана.', 'There are no transactions yet, or the table has not been created.')) ?>
                        </div>
                    <?php else: ?>
                        <div class="table-responsive">
                            <table class="table align-middle">
                                <thead>
                                    <tr>
                                        <th>#</th>
                                        <th><?= e(admin_coins_t('Користувач', 'Пользователь', 'User')) ?></th>
                                        <th><?= e(admin_coins_t('Подія', 'Событие', 'Event')) ?></th>
                                        <th><?= e(admin_coins_t('Δ', 'Δ', 'Δ')) ?></th>
                                        <th><?= e(admin_coins_t('Баланс після', 'Баланс после', 'Balance after')) ?></th>
                                        <th><?= e(admin_coins_t('Пов’язано', 'Связано', 'Related')) ?></th>
                                        <th><?= e(admin_coins_t('Час', 'Время', 'Time')) ?></th>
                                    </tr>
                                </thead>
                                <tbody>
                                    <?php foreach ($recentTransactions as $tx): ?>
                                        <?php
                                        $delta = (int)($tx['delta_amount'] ?? 0);
                                        $deltaClass = $delta > 0 ? 'text-success' : ($delta < 0 ? 'text-danger' : 'text-muted');
                                        $username = trim((string)($tx['username'] ?? ''));
                                        $userLabel = $username !== ''
                                            ? ('@' . $username)
                                            : ('#' . (int)($tx['user_id'] ?? 0));

                                        $relatedUserLabel = '—';
                                        $relatedUsername = trim((string)($tx['related_username'] ?? ''));
                                        $relatedUserId = (int)($tx['related_user_id'] ?? 0);
                                        if ($relatedUsername !== '') {
                                            $relatedUserLabel = '@' . $relatedUsername;
                                        } elseif ($relatedUserId > 0) {
                                            $relatedUserLabel = '#' . $relatedUserId;
                                        }

                                        $eventKey = trim((string)($tx['event_key'] ?? ''));
                                        ?>
                                        <tr>
                                            <td><?= e((string)($tx['id'] ?? '')) ?></td>
                                            <td>
                                                <div class="fw-semibold"><?= e($userLabel) ?></div>
                                                <div class="small text-muted">ID: <?= e((string)($tx['user_id'] ?? 0)) ?></div>
                                            </td>
                                            <td>
                                                <div class="fw-semibold"><?= e(admin_coins_event_label($eventKey)) ?></div>
                                                <div class="small text-muted"><?= e($eventKey) ?></div>
                                                <?php if (trim((string)($tx['note'] ?? '')) !== ''): ?>
                                                    <div class="small text-muted"><?= e((string)$tx['note']) ?></div>
                                                <?php endif; ?>
                                            </td>
                                            <td class="<?= e($deltaClass) ?>">
                                                <?= e(($delta > 0 ? '+' : '') . (string)$delta) ?>
                                            </td>
                                            <td><?= e((string)($tx['balance_after'] ?? 0)) ?></td>
                                            <td><?= e($relatedUserLabel) ?></td>
                                            <td><?= e((string)($tx['created_at'] ?? '')) ?></td>
                                        </tr>
                                    <?php endforeach; ?>
                                </tbody>
                            </table>
                        </div>

                        <?php if ($totalPages > 1): ?>
                            <nav class="mt-3" aria-label="Transactions pagination">
                                <div class="d-flex flex-wrap gap-2 align-items-center">
                                    <?php if ($page > 1): ?>
                                        <a class="btn btn-sm btn-outline-secondary" href="<?= e(admin_coins_pagination_url($page - 1)) ?>">
                                            <?= e(admin_coins_t('← Назад', '← Назад', '← Prev')) ?>
                                        </a>
                                    <?php endif; ?>

                                    <?php
                                    $startPage = max(1, $page - 2);
                                    $endPage   = min($totalPages, $page + 2);

                                    if ($startPage > 1) {
                                        echo '<a class="btn btn-sm btn-outline-secondary" href="' . e(admin_coins_pagination_url(1)) . '">1</a>';
                                        if ($startPage > 2) {
                                            echo '<span class="text-muted px-1">…</span>';
                                        }
                                    }

                                    for ($p = $startPage; $p <= $endPage; $p++):
                                    ?>
                                        <a
                                            class="btn btn-sm <?= $p === $page ? 'btn-primary' : 'btn-outline-secondary' ?>"
                                            href="<?= e(admin_coins_pagination_url($p)) ?>"
                                        ><?= e((string)$p) ?></a>
                                    <?php endfor; ?>

                                    <?php
                                    if ($endPage < $totalPages) {
                                        if ($endPage < $totalPages - 1) {
                                            echo '<span class="text-muted px-1">…</span>';
                                        }
                                        echo '<a class="btn btn-sm btn-outline-secondary" href="' . e(admin_coins_pagination_url($totalPages)) . '">' . e((string)$totalPages) . '</a>';
                                    }
                                    ?>

                                    <?php if ($page < $totalPages): ?>
                                        <a class="btn btn-sm btn-outline-secondary" href="<?= e(admin_coins_pagination_url($page + 1)) ?>">
                                            <?= e(admin_coins_t('Далі →', 'Далее →', 'Next →')) ?>
                                        </a>
                                    <?php endif; ?>
                                </div>
                            </nav>
                        <?php endif; ?>
                    <?php endif; ?>
                </div>
            </div>
        </div>

        <div class="col-lg-4">
            <?php admin_sidebar('vmcoins_overview'); ?>
        </div>
    </div>
</div>

<?php require_once __DIR__ . '/../../includes/footer.php'; ?>