<?php
declare(strict_types=1);

require __DIR__ . '/../db/config.php';
require __DIR__ . '/auth_guard.php';

header('Content-Type: application/json');

// Log para debugging
error_log("🔒 SECURITY_SAVE - Iniciando salvamento de configurações de segurança");

try {
    // Validação dos dados recebidos
    $rouletteId = (int)($_POST['roulette_id'] ?? 0);
    $maxPerHour = (int)($_POST['max_spins_per_hour'] ?? 100);
    $maxPerDay = (int)($_POST['max_spins_per_day'] ?? 500);
    $maxPerSession = (int)($_POST['max_spins_per_session'] ?? 50);
    $cooldown = (int)($_POST['cooldown_minutes'] ?? 5);
    $enabled = isset($_POST['enabled']) ? 1 : 0;
    
    // ===== NOVOS CAMPOS: LIMITE TOTAL =====
    $maxTotalSpins = !empty($_POST['max_total_spins']) ? (int)$_POST['max_total_spins'] : null;
    $totalSpinsPeriod = $_POST['total_spins_period'] ?? null;
    $permanentBlockOnTotal = isset($_POST['permanent_block_on_total']) ? 1 : 0;

    // Validações básicas
    if ($rouletteId <= 0) {
        throw new Exception('ID da roleta inválido.');
    }

    if ($maxPerHour <= 0 || $maxPerDay <= 0 || $maxPerSession <= 0 || $cooldown <= 0) {
        throw new Exception('Valores de limite devem ser maiores que zero.');
    }

    // Validação do novo campo max_total_spins
    if ($maxTotalSpins !== null && $maxTotalSpins <= 0) {
        throw new Exception('Limite total de giros deve ser maior que zero ou vazio para desabilitar.');
    }

    // Validação do período
    if ($totalSpinsPeriod && !in_array($totalSpinsPeriod, ['day', 'week', 'month', 'forever'], true)) {
        throw new Exception('Período do limite total inválido.');
    }

    // Se maxTotalSpins for definido, o período deve ser especificado (exceto se for forever)
    if ($maxTotalSpins !== null && empty($totalSpinsPeriod)) {
        $totalSpinsPeriod = 'forever'; // Default para forever se não especificado
    }

    // Se não há limite total, limpa o período
    if ($maxTotalSpins === null) {
        $totalSpinsPeriod = null;
        $permanentBlockOnTotal = 0;
    }

    // Verifica se a roleta existe
    $st = $pdo->prepare("SELECT id FROM roulettes WHERE id = ?");
    $st->execute([$rouletteId]);
    if (!$st->fetch()) {
        throw new Exception('Roleta não encontrada.');
    }

    // Log dos dados recebidos
    error_log("🔒 SECURITY_SAVE - Dados recebidos: roulette_id=$rouletteId, max_hour=$maxPerHour, max_day=$maxPerDay, max_session=$maxPerSession, cooldown=$cooldown, enabled=$enabled");
    error_log("🔒 SECURITY_SAVE - Novos campos: max_total=$maxTotalSpins, period=$totalSpinsPeriod, permanent_block=$permanentBlockOnTotal");

    // Verifica se já existe configuração para esta roleta
    $st = $pdo->prepare("SELECT id FROM roulette_limits WHERE roulette_id = ?");
    $st->execute([$rouletteId]);
    $existingConfig = $st->fetch();

    if ($existingConfig) {
        // UPDATE - Já existe configuração
        $sql = "UPDATE roulette_limits 
                SET max_spins_per_hour = ?,
                    max_spins_per_day = ?,
                    max_spins_per_session = ?,
                    cooldown_minutes = ?,
                    enabled = ?,
                    max_total_spins = ?,
                    total_spins_period = ?,
                    permanent_block_on_total = ?,
                    updated_at = CURRENT_TIMESTAMP
                WHERE roulette_id = ?";
        
        $st = $pdo->prepare($sql);
        $success = $st->execute([
            $maxPerHour, 
            $maxPerDay, 
            $maxPerSession, 
            $cooldown, 
            $enabled,
            $maxTotalSpins,
            $totalSpinsPeriod,
            $permanentBlockOnTotal,
            $rouletteId
        ]);
        
        $action = 'atualizada';
        error_log("🔒 SECURITY_SAVE - Configuração existente atualizada para roleta: $rouletteId");
    } else {
        // INSERT - Nova configuração
        $sql = "INSERT INTO roulette_limits 
                (roulette_id, max_spins_per_hour, max_spins_per_day, max_spins_per_session, cooldown_minutes, enabled, max_total_spins, total_spins_period, permanent_block_on_total)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
        
        $st = $pdo->prepare($sql);
        $success = $st->execute([
            $rouletteId, 
            $maxPerHour, 
            $maxPerDay, 
            $maxPerSession, 
            $cooldown, 
            $enabled,
            $maxTotalSpins,
            $totalSpinsPeriod,
            $permanentBlockOnTotal
        ]);
        
        $action = 'criada';
        error_log("🔒 SECURITY_SAVE - Nova configuração criada para roleta: $rouletteId");
    }

    if ($success) {
        // Log de sucesso
        error_log("✅ SECURITY_SAVE - Configuração $action com sucesso para roleta: $rouletteId");
        
        // Log dos valores salvos
        error_log("📊 VALORES SALVOS - max_total_spins: " . ($maxTotalSpins ?? 'NULL') . 
                 ", total_spins_period: " . ($totalSpinsPeriod ?? 'NULL') . 
                 ", permanent_block_on_total: " . $permanentBlockOnTotal);
        
        echo json_encode([
            'ok' => true,
            'message' => "Configurações de segurança $action com sucesso!",
            'action' => $action,
            'roulette_id' => $rouletteId,
            'limits' => [
                'max_total_spins' => $maxTotalSpins,
                'total_spins_period' => $totalSpinsPeriod,
                'permanent_block_on_total' => $permanentBlockOnTotal
            ]
        ]);
    } else {
        throw new Exception('Falha ao salvar no banco de dados.');
    }

} catch (Exception $e) {
    // Log de erro detalhado
    error_log("❌ SECURITY_SAVE - Erro: " . $e->getMessage());
    error_log("❌ SECURITY_SAVE - POST data: " . print_r($_POST, true));
    
    http_response_code(400);
    echo json_encode([
        'ok' => false, 
        'message' => $e->getMessage(),
        'code' => 'security_save_error'
    ]);
} catch (PDOException $e) {
    // Log de erro de banco de dados
    error_log("❌ SECURITY_SAVE - Erro PDO: " . $e->getMessage());
    
    http_response_code(500);
    echo json_encode([
        'ok' => false, 
        'message' => 'Erro interno do banco de dados.',
        'code' => 'database_error'
    ]);
}