<?php
/**
 * Générateur de captcha sécurisé - SERVICES-AE
 */

session_start();

/**
 * Génère un captcha mathématique avec image
 */
function generateSecureMathCaptcha() {
    // Opérations plus complexes
    $operations = [
        ['type' => 'add', 'symbol' => '+'],
        ['type' => 'subtract', 'symbol' => '-'], 
        ['type' => 'multiply', 'symbol' => '×']
    ];
    
    $operation = $operations[array_rand($operations)];
    
    switch ($operation['type']) {
        case 'add':
            $num1 = rand(10, 50);
            $num2 = rand(1, 30);
            $answer = $num1 + $num2;
            break;
        case 'subtract':
            $num1 = rand(20, 80);
            $num2 = rand(1, $num1 - 1); // S'assurer que le résultat est positif
            $answer = $num1 - $num2;
            break;
        case 'multiply':
            $num1 = rand(2, 12);
            $num2 = rand(2, 9);
            $answer = $num1 * $num2;
            break;
    }
    
    return [
        'num1' => $num1,
        'num2' => $num2,
        'symbol' => $operation['symbol'],
        'answer' => $answer,
        'operation' => $operation['type']
    ];
}

/**
 * Génère une image de captcha avec texte déformé
 */
function generateCaptchaImage($text) {
    $width = 200;
    $height = 80;
    
    // Créer l'image
    $image = imagecreate($width, $height);
    
    // Couleurs
    $bg_color = imagecolorallocate($image, 240, 240, 240);
    $text_color = imagecolorallocate($image, 50, 50, 50);
    $noise_color = imagecolorallocate($image, 150, 150, 150);
    
    // Remplir le fond
    imagefill($image, 0, 0, $bg_color);
    
    // Ajouter du bruit (lignes aléatoires)
    for ($i = 0; $i < 10; $i++) {
        $x1 = rand(0, $width);
        $y1 = rand(0, $height);
        $x2 = rand(0, $width);
        $y2 = rand(0, $height);
        imageline($image, $x1, $y1, $x2, $y2, $noise_color);
    }
    
    // Ajouter des points de bruit
    for ($i = 0; $i < 100; $i++) {
        $x = rand(0, $width);
        $y = rand(0, $height);
        imagesetpixel($image, $x, $y, $noise_color);
    }
    
    // Ajouter le texte avec une police
    $font_size = 20;
    $angle = rand(-10, 10);
    $x = ($width - strlen($text) * 12) / 2;
    $y = $height / 2 + 10;
    
    // Si on a une police TrueType disponible
    if (function_exists('imagettftext') && file_exists('fonts/arial.ttf')) {
        imagettftext($image, $font_size, $angle, $x, $y, $text_color, 'fonts/arial.ttf', $text);
    } else {
        // Utiliser la police par défaut
        imagestring($image, 5, $x, $y - 15, $text, $text_color);
    }
    
    // Sauvegarder l'image temporairement
    $filename = 'captcha_' . session_id() . '.png';
    $filepath = 'temp/' . $filename;
    
    // Créer le dossier temp s'il n'existe pas
    if (!is_dir('temp')) {
        mkdir('temp', 0755, true);
    }
    
    imagepng($image, $filepath);
    imagedestroy($image);
    
    return $filename;
}

/**
 * Génère un captcha textuel complexe
 */
function generateTextCaptcha() {
    $questions = [
        ['question' => 'Combien de jours dans une semaine ?', 'answer' => 7],
        ['question' => 'Combien de mois dans une année ?', 'answer' => 12],
        ['question' => 'Combien font 3 × 4 ?', 'answer' => 12],
        ['question' => 'Combien font 15 ÷ 3 ?', 'answer' => 5],
        ['question' => 'Quel est le double de 8 ?', 'answer' => 16],
        ['question' => 'Combien font 20 - 7 ?', 'answer' => 13],
        ['question' => 'Quelle heure est-il dans 2h si il est 14h ?', 'answer' => 16],
        ['question' => 'Combien de côtés a un triangle ?', 'answer' => 3],
        ['question' => 'Combien font 6 + 9 ?', 'answer' => 15],
        ['question' => 'Combien de roues a une voiture ?', 'answer' => 4]
    ];
    
    return $questions[array_rand($questions)];
}

// Gérer la génération du captcha
if (isset($_GET['generate'])) {
    $type = $_GET['type'] ?? 'math';
    
    switch ($type) {
        case 'math':
            $captcha = generateSecureMathCaptcha();
            $_SESSION['captcha_answer'] = $captcha['answer'];
            $_SESSION['captcha_expires'] = time() + 300; // 5 minutes
            
            header('Content-Type: application/json');
            echo json_encode([
                'success' => true,
                'question' => $captcha['num1'] . ' ' . $captcha['symbol'] . ' ' . $captcha['num2'] . ' = ?',
                'expires' => $_SESSION['captcha_expires']
            ]);
            break;
            
        case 'text':
            $captcha = generateTextCaptcha();
            $_SESSION['captcha_answer'] = $captcha['answer'];
            $_SESSION['captcha_expires'] = time() + 300; // 5 minutes
            
            header('Content-Type: application/json');
            echo json_encode([
                'success' => true,
                'question' => $captcha['question'],
                'expires' => $_SESSION['captcha_expires']
            ]);
            break;
            
        case 'image':
            $math_captcha = generateSecureMathCaptcha();
            $text = $math_captcha['num1'] . ' ' . $math_captcha['symbol'] . ' ' . $math_captcha['num2'] . ' = ?';
            $filename = generateCaptchaImage($text);
            
            $_SESSION['captcha_answer'] = $math_captcha['answer'];
            $_SESSION['captcha_expires'] = time() + 300; // 5 minutes
            
            header('Content-Type: application/json');
            echo json_encode([
                'success' => true,
                'image' => 'temp/' . $filename,
                'expires' => $_SESSION['captcha_expires']
            ]);
            break;
    }
    exit;
}

/**
 * Valide le captcha
 */
function validateCaptcha($user_answer) {
    if (!isset($_SESSION['captcha_answer']) || !isset($_SESSION['captcha_expires'])) {
        return false;
    }
    
    // Vérifier l'expiration
    if (time() > $_SESSION['captcha_expires']) {
        unset($_SESSION['captcha_answer']);
        unset($_SESSION['captcha_expires']);
        return false;
    }
    
    // Vérifier la réponse
    $is_correct = (intval($user_answer) === intval($_SESSION['captcha_answer']));
    
    // Nettoyer après utilisation
    if ($is_correct) {
        unset($_SESSION['captcha_answer']);
        unset($_SESSION['captcha_expires']);
    }
    
    return $is_correct;
}

// Page de test
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>🛡️ Captcha Sécurisé - Test</title>
    <style>
        body { font-family: Arial; margin: 20px; background: #f8f9fa; }
        .captcha-container { background: white; padding: 20px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); margin: 20px 0; }
        .captcha-type { margin: 15px 0; }
        .captcha-question { background: #e9ecef; padding: 15px; border-radius: 8px; margin: 10px 0; font-size: 18px; font-weight: bold; text-align: center; }
        .captcha-input { padding: 10px; border: 2px solid #dee2e6; border-radius: 5px; font-size: 16px; width: 100px; text-align: center; }
        button { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin: 5px; }
        button:hover { background: #0056b3; }
        .result { padding: 10px; border-radius: 5px; margin: 10px 0; }
        .success { background: #d4edda; color: #155724; }
        .error { background: #f8d7da; color: #721c24; }
    </style>
</head>
<body>
    <h1>🛡️ Test des Captchas Sécurisés</h1>
    
    <!-- Captcha Mathématique Avancé -->
    <div class="captcha-container">
        <h3>1. Captcha Mathématique Avancé</h3>
        <button onclick="generateCaptcha('math')">Générer nouveau calcul</button>
        <div id="math-question" class="captcha-question">Cliquez pour générer</div>
        <input type="number" id="math-answer" class="captcha-input" placeholder="Réponse">
        <button onclick="testCaptcha('math')">Tester</button>
        <div id="math-result"></div>
    </div>
    
    <!-- Captcha Textuel -->
    <div class="captcha-container">
        <h3>2. Captcha Questions Textuelles</h3>
        <button onclick="generateCaptcha('text')">Générer nouvelle question</button>
        <div id="text-question" class="captcha-question">Cliquez pour générer</div>
        <input type="number" id="text-answer" class="captcha-input" placeholder="Réponse">
        <button onclick="testCaptcha('text')">Tester</button>
        <div id="text-result"></div>
    </div>
    
    <!-- Captcha Image (si GD est activé) -->
    <div class="captcha-container">
        <h3>3. Captcha Image (Expérimental)</h3>
        <button onclick="generateCaptcha('image')">Générer image</button>
        <div id="image-question" class="captcha-question">
            <div id="captcha-image-container"></div>
        </div>
        <input type="number" id="image-answer" class="captcha-input" placeholder="Réponse">
        <button onclick="testCaptcha('image')">Tester</button>
        <div id="image-result"></div>
    </div>
    
    <div style="margin-top: 30px; padding: 20px; background: #e7f3ff; border-radius: 10px;">
        <h3>🎯 Niveau de sécurité estimé :</h3>
        <ul>
            <li><strong>Captcha simple actuel :</strong> 3/10</li>
            <li><strong>Captcha mathématique avancé :</strong> 6/10</li>
            <li><strong>Captcha textuel :</strong> 7/10</li>
            <li><strong>Captcha image :</strong> 8/10</li>
            <li><strong>reCAPTCHA v3 Google :</strong> 9/10</li>
        </ul>
    </div>
    
    <script>
    let currentType = '';
    
    function generateCaptcha(type) {
        currentType = type;
        fetch('?generate=1&type=' + type)
        .then(response => response.json())
        .then(data => {
            if (data.success) {
                if (type === 'image' && data.image) {
                    document.getElementById('captcha-image-container').innerHTML = 
                        '<img src="' + data.image + '" alt="Captcha" style="max-width: 200px;">';
                } else {
                    document.getElementById(type + '-question').textContent = data.question;
                }
                
                // Afficher le temps d'expiration
                const expires = new Date(data.expires * 1000);
                console.log('Captcha expire à:', expires);
            }
        });
    }
    
    function testCaptcha(type) {
        const answer = document.getElementById(type + '-answer').value;
        const resultDiv = document.getElementById(type + '-result');
        
        if (!answer) {
            resultDiv.innerHTML = '<div class="error">Veuillez entrer une réponse</div>';
            return;
        }
        
        // Simulation de validation (en réalité, cela se ferait côté serveur)
        fetch('validate-captcha.php', {
            method: 'POST',
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            body: 'captcha_answer=' + answer
        })
        .then(response => response.json())
        .then(data => {
            if (data.success) {
                resultDiv.innerHTML = '<div class="success">✅ Correct ! Captcha validé</div>';
            } else {
                resultDiv.innerHTML = '<div class="error">❌ ' + data.message + '</div>';
            }
        })
        .catch(() => {
            // Fallback pour le test
            if (type === 'math' && parseInt(answer) > 0 && parseInt(answer) < 500) {
                resultDiv.innerHTML = '<div class="success">✅ Test validé (simulation)</div>';
            } else {
                resultDiv.innerHTML = '<div class="error">❌ Test échoué (simulation)</div>';
            }
        });
    }
    </script>
    
    <p style="margin-top: 30px;">
        <a href="add-testimonial.php">📝 Retour au formulaire</a> | 
        <a href="security-analysis.php">🔍 Analyse complète</a>
    </p>

</body>
</html>