<?php
/**
 * Plan Limits Helper
 * Verifica limites e recursos do plano da loja
 */

/**
 * Busca os limites do plano atual da loja
 * 
 * @param PDO $pdo Conexão com banco de dados
 * @param int $storeId ID da loja
 * @return array Dados do plano com limites
 */
function getStorePlanLimits(PDO $pdo, int $storeId): array
{
    $stmt = $pdo->prepare("
        SELECT p.* 
        FROM stores s 
        LEFT JOIN plans p ON s.plan_id = p.id 
        WHERE s.id = ?
    ");
    $stmt->execute([$storeId]);
    $plan = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$plan) {
        // Retorna limites padrão do plano gratuito
        return [
            'id' => 'free',
            'name' => 'Grátis',
            'max_products' => 10,
            'max_orders_per_month' => 50,
            'max_staff_users' => 1,
            'whatsapp_integration' => 0,
            'custom_domain' => 0,
            'control_panel' => 1,
            'full_reports' => 0,
            'dedicated_support' => 0
        ];
    }
    
    return $plan;
}

/**
 * Conta produtos ativos da loja
 */
function countStoreProducts(PDO $pdo, int $storeId): int
{
    $stmt = $pdo->prepare("
        SELECT COUNT(*) FROM products 
        WHERE store_id = ? AND deleted_at IS NULL
    ");
    $stmt->execute([$storeId]);
    return (int) $stmt->fetchColumn();
}

/**
 * Conta pedidos do mês atual da loja
 */
function countStoreOrdersThisMonth(PDO $pdo, int $storeId): int
{
    $stmt = $pdo->prepare("
        SELECT COUNT(*) FROM orders 
        WHERE store_id = ? 
        AND MONTH(created_at) = MONTH(CURRENT_DATE()) 
        AND YEAR(created_at) = YEAR(CURRENT_DATE())
    ");
    $stmt->execute([$storeId]);
    return (int) $stmt->fetchColumn();
}

/**
 * Conta usuários (staff) da loja
 */
function countStoreUsers(PDO $pdo, int $storeId): int
{
    $stmt = $pdo->prepare("
        SELECT COUNT(*) FROM users 
        WHERE store_id = ? AND deleted_at IS NULL
    ");
    $stmt->execute([$storeId]);
    return (int) $stmt->fetchColumn();
}

/**
 * Verifica se a loja pode adicionar mais produtos
 * 
 * @return array ['allowed' => bool, 'current' => int, 'max' => int, 'message' => string]
 */
function canAddProduct(PDO $pdo, int $storeId): array
{
    $plan = getStorePlanLimits($pdo, $storeId);
    $current = countStoreProducts($pdo, $storeId);
    $max = $plan['max_products'];
    
    // NULL ou valor muito alto significa ilimitado
    $isUnlimited = $max === null || $max < 0 || $max > 99999;
    $allowed = $isUnlimited || $current < $max;
    
    return [
        'allowed' => $allowed,
        'current' => $current,
        'max' => $isUnlimited ? -1 : $max,
        'plan_name' => $plan['name'] ?? 'Grátis',
        'message' => $allowed 
            ? '' 
            : "Você atingiu o limite de {$max} produtos do plano {$plan['name']}. Faça upgrade para adicionar mais produtos."
    ];
}

/**
 * Verifica se a loja pode receber mais pedidos este mês
 */
function canReceiveOrder(PDO $pdo, int $storeId): array
{
    $plan = getStorePlanLimits($pdo, $storeId);
    $current = countStoreOrdersThisMonth($pdo, $storeId);
    $max = $plan['max_orders_per_month'];
    
    $isUnlimited = $max === null || $max < 0 || $max > 99999;
    $allowed = $isUnlimited || $current < $max;
    
    return [
        'allowed' => $allowed,
        'current' => $current,
        'max' => $isUnlimited ? -1 : $max,
        'plan_name' => $plan['name'] ?? 'Grátis',
        'message' => $allowed 
            ? '' 
            : "Limite de {$max} pedidos/mês atingido no plano {$plan['name']}. Faça upgrade para receber mais pedidos."
    ];
}

/**
 * Verifica se a loja pode adicionar mais usuários
 */
function canAddUser(PDO $pdo, int $storeId): array
{
    $plan = getStorePlanLimits($pdo, $storeId);
    $current = countStoreUsers($pdo, $storeId);
    $max = $plan['max_staff_users'];
    
    $isUnlimited = $max === null || $max < 0 || $max > 99999;
    $allowed = $isUnlimited || $current < $max;
    
    return [
        'allowed' => $allowed,
        'current' => $current,
        'max' => $isUnlimited ? -1 : $max,
        'plan_name' => $plan['name'] ?? 'Grátis',
        'message' => $allowed 
            ? '' 
            : "Limite de {$max} usuários atingido no plano {$plan['name']}. Faça upgrade para adicionar mais usuários."
    ];
}

/**
 * Verifica se a loja tem acesso ao recurso de WhatsApp
 */
function hasWhatsAppIntegration(PDO $pdo, int $storeId): array
{
    $plan = getStorePlanLimits($pdo, $storeId);
    $allowed = !empty($plan['whatsapp_integration']);
    
    return [
        'allowed' => $allowed,
        'plan_name' => $plan['name'] ?? 'Grátis',
        'message' => $allowed 
            ? '' 
            : "Integração WhatsApp não disponível no plano {$plan['name']}. Faça upgrade para ativar este recurso."
    ];
}

/**
 * Verifica se a loja tem acesso ao recurso de domínio personalizado
 */
function hasCustomDomain(PDO $pdo, int $storeId): array
{
    $plan = getStorePlanLimits($pdo, $storeId);
    $allowed = !empty($plan['custom_domain']);
    
    return [
        'allowed' => $allowed,
        'plan_name' => $plan['name'] ?? 'Grátis',
        'message' => $allowed 
            ? '' 
            : "Domínio personalizado não disponível no plano {$plan['name']}. Faça upgrade para ativar este recurso."
    ];
}

/**
 * Verifica se a loja tem acesso a relatórios completos
 */
function hasFullReports(PDO $pdo, int $storeId): array
{
    $plan = getStorePlanLimits($pdo, $storeId);
    $allowed = !empty($plan['full_reports']);
    
    return [
        'allowed' => $allowed,
        'plan_name' => $plan['name'] ?? 'Grátis',
        'message' => $allowed 
            ? '' 
            : "Relatórios completos não disponíveis no plano {$plan['name']}. Faça upgrade para ativar."
    ];
}

/**
 * Retorna um resumo completo dos limites e uso atual
 */
function getPlanUsageSummary(PDO $pdo, int $storeId): array
{
    $plan = getStorePlanLimits($pdo, $storeId);
    
    $products = countStoreProducts($pdo, $storeId);
    $orders = countStoreOrdersThisMonth($pdo, $storeId);
    $users = countStoreUsers($pdo, $storeId);
    
    $maxProducts = $plan['max_products'] ?? 0;
    $maxOrders = $plan['max_orders_per_month'] ?? 0;
    $maxUsers = $plan['max_staff_users'] ?? 1;
    
    return [
        'plan' => [
            'id' => $plan['id'] ?? 'free',
            'name' => $plan['name'] ?? 'Grátis'
        ],
        'limits' => [
            'products' => [
                'current' => $products,
                'max' => ($maxProducts === null || $maxProducts < 0) ? -1 : $maxProducts,
                'unlimited' => ($maxProducts === null || $maxProducts < 0 || $maxProducts > 99999),
                'percentage' => ($maxProducts > 0) ? round(($products / $maxProducts) * 100) : 0
            ],
            'orders' => [
                'current' => $orders,
                'max' => ($maxOrders === null || $maxOrders < 0) ? -1 : $maxOrders,
                'unlimited' => ($maxOrders === null || $maxOrders < 0 || $maxOrders > 99999),
                'percentage' => ($maxOrders > 0) ? round(($orders / $maxOrders) * 100) : 0
            ],
            'users' => [
                'current' => $users,
                'max' => ($maxUsers === null || $maxUsers < 0) ? -1 : $maxUsers,
                'unlimited' => ($maxUsers === null || $maxUsers < 0 || $maxUsers > 99999),
                'percentage' => ($maxUsers > 0) ? round(($users / $maxUsers) * 100) : 0
            ]
        ],
        'features' => [
            'whatsapp_integration' => !empty($plan['whatsapp_integration']),
            'custom_domain' => !empty($plan['custom_domain']),
            'control_panel' => !empty($plan['control_panel']),
            'full_reports' => !empty($plan['full_reports']),
            'dedicated_support' => !empty($plan['dedicated_support'])
        ]
    ];
}
