<?php
// ============================================================
// Manifiesto de plugins y sus builds.
// Añade aquí cada plugin nuevo (y sus versiones) sin tocar la BD.
// Las builds FREE viven en  {slug}/descargas/
// Las builds PREMIUM viven en  builds_protegidos/{slug}/  (bloqueadas)
// ============================================================

function plugins_all(): array {
    // Cada plugin define su PROPIO precio en su bloque 'price'.
    return [
        'slotmachine' => [
            'name'    => 'SlotMachine',
            'icon'    => '🎰',
            'tagline' => 'Casino · tragamonedas con jackpot',
            'price'   => '4.99',
            'wiki'    => 'slotmachine/',
            'builds'  => [
                'free' => [
                    ['version' => '1.0.1', 'file' => 'SlotMachine-1.0.1.jar', 'size' => '57 KB', 'date' => '2026-07-08'],
                ],
                'premium' => [
                    ['version' => '1.0.1', 'file' => 'SlotMachine-Premium-1.0.1.jar', 'size' => '76 KB', 'date' => '2026-07-08'],
                ],
            ],
        ],
        'contractrpg' => [
            'name'    => 'ContractRPG',
            'icon'    => '📜',
            'tagline' => 'Contratos · misiones RPG con tienda y ranking',
            'price'   => '0',
            'wiki'    => 'contractrpg/',
            'builds'  => [
                'free' => [
                    ['version' => '1.0', 'file' => 'ContractRPG-1.0.jar', 'size' => '14 MB', 'date' => '2026-07-11'],
                ],
            ],
        ],
        'waterborne' => [
            'name'    => 'Waterborne',
            'icon'    => '💧',
            'tagline' => 'Sed hardcore · parásitos del agua y curas',
            'price'   => '0',
            'wiki'    => 'waterborne/',
            'builds'  => [
                'free' => [
                    ['version' => '1.0', 'file' => 'Waterborne-1.0.jar', 'size' => '760 KB', 'date' => '2026-07-13'],
                ],
            ],
        ],
        'elementalarms' => [
            'name'    => 'ElementalArms',
            'icon'    => '⚔️',
            'tagline' => 'Ítems RPG · daño elemental · habilidades · equipo',
            'price'   => '8.99',
            'wiki'    => 'elementalarms/',
            'builds'  => [
                'premium' => [
                    ['version' => '1.0.0', 'file' => 'ElementalArms-1.0.0.jar', 'size' => '520 KB', 'date' => '2026-07-16'],
                ],
            ],
        ],
    ];
}

function plugin_get(string $slug): ?array {
    return plugins_all()[$slug] ?? null;
}

// Última build (la primera del array) de una edición.
function plugin_latest(string $slug, string $edition): ?array {
    $p = plugin_get($slug);
    return $p['builds'][$edition][0] ?? null;
}

// Busca una build concreta por versión (valida contra el manifiesto → sin path traversal).
function plugin_build_find(string $slug, string $edition, string $version): ?array {
    $p = plugin_get($slug);
    if (!$p) return null;
    foreach ($p['builds'][$edition] ?? [] as $b) {
        if ($b['version'] === $version) return $b;
    }
    return null;
}

// Devuelve las licencias premium activas del usuario, indexadas por plugin_slug.
function user_licenses(int $userId): array {
    $st = db()->prepare("SELECT * FROM licenses WHERE user_id = ? AND status = 'active'");
    $st->execute([$userId]);
    $out = [];
    foreach ($st->fetchAll() as $l) { $out[$l['plugin_slug']] = $l; }
    return $out;
}

// Descargas del usuario, indexadas por "slug:edition" (con la versión que bajó).
function user_downloads(int $userId): array {
    try {
        $st = db()->prepare("SELECT plugin_slug, edition, version, updated_at FROM downloads WHERE user_id = ?");
        $st->execute([$userId]);
        $out = [];
        foreach ($st->fetchAll() as $r) { $out[$r['plugin_slug'] . ':' . $r['edition']] = $r; }
        return $out;
    } catch (Throwable $e) { return []; }
}

// Registra (o actualiza) que un usuario descargó una build.
function record_download(int $userId, string $slug, string $edition, string $version): void {
    try {
        db()->prepare(
            'INSERT INTO downloads (user_id, plugin_slug, edition, version) VALUES (?, ?, ?, ?)
             ON DUPLICATE KEY UPDATE version = VALUES(version), updated_at = NOW()'
        )->execute([$userId, $slug, $edition, $version]);
    } catch (Throwable $e) { /* no crítico */ }
}

// ¿Hay una versión más nueva que la que el usuario tiene descargada?
function has_update(?array $downloadRow, ?array $latestBuild): bool {
    if (!$downloadRow || !$latestBuild) return false;
    return version_compare($downloadRow['version'], $latestBuild['version'], '<');
}

// Genera una llave de licencia única y legible, ej: SLOT-PREM-A1B2-C3D4-E5F6
function gen_license_key(string $slug): string {
    $hex = strtoupper(bin2hex(random_bytes(6)));
    $pre = strtoupper(substr(preg_replace('/[^A-Za-z0-9]/', '', $slug), 0, 4));
    return $pre . '-PREM-' . substr($hex, 0, 4) . '-' . substr($hex, 4, 4) . '-' . substr($hex, 8, 4);
}

// Badge premium ANIMADO con el nombre del plugin (dorado, con brillo que barre).
function plugin_badge(string $slug): string {
    $p = plugin_get($slug);
    $name = $p ? $p['name'] : ucfirst($slug);
    return '<span class="pbadge"><span class="ic">★</span>' . e($name) . '</span>';
}

// Varios badges a partir de un CSV de slugs (GROUP_CONCAT). Muestra TODAS las compras del usuario.
function plugin_badges_from_csv(?string $csv): string {
    if (!$csv) return '';
    $out = '';
    foreach (array_unique(array_filter(explode(',', $csv))) as $slug) {
        $out .= plugin_badge(trim($slug));
    }
    return $out;
}

// Badge de rol: ADMIN (rojo, corona, animado) o USUARIO (azul). Todo el que comenta tiene uno.
function role_badge(bool $isAdmin): string {
    if ($isAdmin) {
        return '<span class="ubadge admin"><span class="crown">👑</span>ADMIN</span>';
    }
    return '<span class="ubadge user">USUARIO</span>';
}

// Conjunto completo de badges de una reseña: rol + TODOS los plugins premium que posee.
function review_badges(bool $isAdmin, ?string $ownedCsv): string {
    return role_badge($isAdmin) . plugin_badges_from_csv($ownedCsv);
}
