#!/usr/bin/env php
<?php
/**
 * Script de test pour la validation ultra-souple des usernames
 * Teste les nouvelles règles : 8-30 caractères UTF-8, tous caractères acceptés
 */

// Configuration
$apiUrl = 'http://localhost/api';
$sessionId = ''; // À remplir avec un session_id valide

// Couleurs pour la sortie
$red = "\033[31m";
$green = "\033[32m";
$yellow = "\033[33m";
$blue = "\033[34m";
$reset = "\033[0m";

function testRequest($endpoint, $method, $data = null, $sessionId = '') {
    $ch = curl_init($endpoint);
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    
    if ($sessionId) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json; charset=UTF-8',
            'Authorization: Bearer ' . $sessionId
        ]);
    } else {
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=UTF-8']);
    }
    
    if ($data) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));
    }
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    return [
        'code' => $httpCode,
        'body' => json_decode($response, true) ?: $response
    ];
}

echo $blue . "=== Test de validation ultra-souple des usernames ===" . $reset . "\n";
echo "Nouvelles règles : 8-30 caractères UTF-8, tous caractères acceptés\n\n";

// Cas qui doivent ÉCHOUER (trop court ou trop long)
$testsFail = [
    ['username' => 'abc', 'desc' => 'Trop court (3 car.)'],
    ['username' => '1234567', 'desc' => 'Trop court (7 car.)'],
    ['username' => str_repeat('a', 31), 'desc' => 'Trop long (31 car.)'],
    ['username' => str_repeat('😀', 31), 'desc' => 'Trop long (31 émojis)'],
    ['username' => '   ', 'desc' => 'Espaces seulement (devient vide après trim)'],
];

// Cas qui doivent RÉUSSIR
$testsSuccess = [
    ['username' => 'Jean-Pierre', 'desc' => 'Nom avec tiret et majuscules'],
    ['username' => '12345678', 'desc' => 'Chiffres seulement (8 car.)'],
    ['username' => 'user@company', 'desc' => 'Avec arobase'],
    ['username' => 'Marie 2024', 'desc' => 'Avec espace'],
    ['username' => 'josé.garcía', 'desc' => 'Avec accents'],
    ['username' => '用户2024', 'desc' => 'Caractères chinois'],
    ['username' => 'مستخدم123', 'desc' => 'Caractères arabes'],
    ['username' => 'Admin_#123!', 'desc' => 'Caractères spéciaux'],
    ['username' => '😀🎉Party2024', 'desc' => 'Avec émojis'],
    ['username' => 'Пользователь', 'desc' => 'Cyrillique'],
    ['username' => '  espacé  ', 'desc' => 'Espaces (seront trimés)'],
    ['username' => 'a' . str_repeat('b', 28) . 'c', 'desc' => 'Exactement 30 car.'],
];

echo $yellow . "Tests qui doivent ÉCHOUER :" . $reset . "\n\n";

foreach ($testsFail as $index => $test) {
    echo "Test " . ($index + 1) . ": " . $test['desc'] . "\n";
    echo "Username: \"" . $test['username'] . "\"\n";
    
    $result = testRequest($apiUrl . '/users/check-username', 'POST', ['username' => $test['username']], $sessionId);
    
    $isExpectedFailure = ($result['code'] == 400);
    echo "Code HTTP: " . ($isExpectedFailure ? $green : $red) . $result['code'] . $reset;
    echo " - " . ($isExpectedFailure ? $green . "✓ OK" : $red . "✗ ERREUR") . $reset . "\n";
    
    if (is_array($result['body'])) {
        echo "Message: " . $result['body']['message'] . "\n";
        if (isset($result['body']['details'])) {
            echo "Détails: " . $result['body']['details'] . "\n";
        }
    }
    echo "\n";
}

echo $yellow . "Tests qui doivent RÉUSSIR :" . $reset . "\n\n";

foreach ($testsSuccess as $index => $test) {
    echo "Test " . ($index + 1) . ": " . $test['desc'] . "\n";
    echo "Username: \"" . $test['username'] . "\"\n";
    echo "Longueur: " . mb_strlen(trim($test['username']), 'UTF-8') . " caractères\n";
    
    $result = testRequest($apiUrl . '/users/check-username', 'POST', ['username' => $test['username']], $sessionId);
    
    $isExpectedSuccess = ($result['code'] == 200);
    echo "Code HTTP: " . ($isExpectedSuccess ? $green : $red) . $result['code'] . $reset;
    echo " - " . ($isExpectedSuccess ? $green . "✓ OK" : $red . "✗ ERREUR") . $reset . "\n";
    
    if (is_array($result['body'])) {
        if ($result['code'] == 200) {
            echo "Disponible: " . ($result['body']['available'] ? $green . "Oui" : $yellow . "Non (déjà pris)") . $reset . "\n";
        } else {
            echo "Message: " . $result['body']['message'] . "\n";
            if (isset($result['body']['details'])) {
                echo "Détails: " . $result['body']['details'] . "\n";
            }
        }
    }
    echo "\n";
}

echo $blue . "=== Résumé des nouvelles règles ===" . $reset . "\n";
echo "✓ Minimum : 8 caractères UTF-8\n";
echo "✓ Maximum : 30 caractères UTF-8\n";
echo "✓ Tous caractères acceptés (lettres, chiffres, espaces, émojis, accents, etc.)\n";
echo "✓ Trim automatique des espaces début/fin\n";
echo "✓ Sensible à la casse (Jean ≠ jean)\n";
echo "✓ Unicité vérifiée dans toute la base\n\n";

echo $yellow . "Note: N'oubliez pas d'exécuter le script SQL de migration !" . $reset . "\n";
echo "scripts/sql/migration_username_utf8_support.sql\n";