<?php
// app/app/plans.php
// Carrega features de um plano do banco e expõe helpers.

require_once __DIR__ . '/db.php';

/**
 * Catálogo completo de features (mesmo do admgeral).
 * Use isso pra validar/listar o que existe.
 */
function plans_features_catalog(): array {
    return [
        'painel'             => 'Painel',
        'conexoes'           => 'Conexões',
        'leads'              => 'Leads',
        'disparos'           => 'Disparos',
        'crm'                => 'CRM/Follow-Up',
        'funis'              => 'Funil de Prospecção',
        'webhook'            => 'Webhook',
        'agente-disparo'     => 'Agente de Disparo',
        'agente-atendimento' => 'Agente de Atendimento',
        'extrator-maps'      => 'Extrator Google Maps',
        'instagram'          => 'Extrator Instagram',
        'radarcnpj'          => 'Extrator Radar CNPJ',
        'gruposwpp'          => 'Extrator Grupos WhatsApp',
        'apioficial'         => 'API Oficial — Conexão',
        'disparos_oficial'   => 'API Oficial — Disparos',
        'dicas'              => 'Dicas',
        'evolua_chat'        => 'Evolua Chat',
        'minha_conta'        => 'Minha Conta',
        'atualizacoes'       => 'Atualizações',
        'suporte'            => 'Suporte',
    ];
}

/**
 * Busca um plano pelo ID. Retorna ['id', 'name', 'features' (array)] ou null.
 */
function plans_get(string $planId): ?array {
    if ($planId === '') return null;

    static $cache = [];
    if (isset($cache[$planId])) return $cache[$planId];

    try {
        $pdo = db();
        $stmt = $pdo->prepare('SELECT id, name, description, features FROM plans WHERE id = :id');
        $stmt->execute([':id' => $planId]);
        $row = $stmt->fetch();
        if (!$row) {
            $cache[$planId] = null;
            return null;
        }

        $features = $row['features'];
        if (is_string($features)) $features = json_decode($features, true) ?: [];

        $cache[$planId] = [
            'id'          => $row['id'],
            'name'        => $row['name'],
            'description' => $row['description'] ?? '',
            'features'    => is_array($features) ? $features : [],
        ];
        return $cache[$planId];
    } catch (Throwable $e) {
        error_log('plans_get error: ' . $e->getMessage());
        $cache[$planId] = null;
        return null;
    }
}

/**
 * Busca o plano default (fallback).
 */
function plans_get_default(): ?array {
    try {
        $pdo = db();
        $stmt = $pdo->query('SELECT id, name, description, features FROM plans WHERE is_default = true LIMIT 1');
        $row = $stmt->fetch();
        if (!$row) return null;

        $features = $row['features'];
        if (is_string($features)) $features = json_decode($features, true) ?: [];

        return [
            'id'          => $row['id'],
            'name'        => $row['name'],
            'description' => $row['description'] ?? '',
            'features'    => is_array($features) ? $features : [],
        ];
    } catch (Throwable $e) {
        error_log('plans_get_default error: ' . $e->getMessage());
        return null;
    }
}

/**
 * Resolve o plano de um usuário. Se o plan_id não existir mais (ex: deletado),
 * cai pro default. Se nem isso existir, retorna features vazias.
 *
 * Resultado vem da SESSÃO se já foi carregado.
 */
function plans_resolve_for_user(string $userPlanId): array {
    $plan = plans_get($userPlanId);
    if (!$plan) {
        // Plano não existe mais (foi deletado), cai pro default
        $plan = plans_get_default();
    }
    if (!$plan) {
        // Nem plan, nem default → sem features
        return ['id' => $userPlanId, 'name' => 'Sem plano', 'features' => []];
    }
    return $plan;
}

/**
 * Carrega features do usuário na SESSÃO (chamado no login).
 */
function plans_load_into_session(string $userPlanId): void {
    $plan = plans_resolve_for_user($userPlanId);
    $_SESSION['user_plan_data'] = [
        'id'       => $plan['id'],
        'name'     => $plan['name'],
        'features' => $plan['features'],
    ];
}

/**
 * Lê features do usuário da sessão. Retorna array de strings.
 * Se não tiver carregado ainda, carrega na hora.
 */
function plans_user_features(): array {
    if (!empty($_SESSION['user_plan_data']['features'])) {
        return $_SESSION['user_plan_data']['features'];
    }

    // Não carregou ainda — busca o plano do usuário no banco
    $userId = $_SESSION['user']['id'] ?? null;
    if (!$userId) return [];

    try {
        $pdo = db();
        $stmt = $pdo->prepare('SELECT plan FROM auth_users WHERE id = :id LIMIT 1');
        $stmt->execute([':id' => $userId]);
        $planId = $stmt->fetchColumn();
        if (!$planId) return [];

        plans_load_into_session($planId);
        return $_SESSION['user_plan_data']['features'] ?? [];
    } catch (Throwable $e) {
        return [];
    }
}

/**
 * Retorna nome amigável do plano do usuário (ex: "Plano Bronze 🥉").
 */
function plans_user_plan_name(): string {
    return $_SESSION['user_plan_data']['name'] ?? 'Sem plano';
}

/**
 * Verifica se o usuário tem acesso a uma feature.
 */
function plans_user_can_view(string $feature): bool {
    return in_array($feature, plans_user_features(), true);
}
