<?php
/**
 * Script de test pour vérifier l'intégration Stripe
 * Usage: php test_stripe.php
 */

require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/src/Config/AppConfig.php';
require_once __DIR__ . '/src/Services/StripeService.php';
require_once __DIR__ . '/src/Core/Database.php';

// Forcer l'environnement dev
$_SERVER['SERVER_NAME'] = 'app.geo.dev';

echo "================================\n";
echo "Test de l'intégration Stripe\n";
echo "================================\n\n";

try {
    // Test 1: Configuration
    echo "1. Test de la configuration...\n";
    $config = AppConfig::getInstance();
    $stripeConfig = $config->getStripeConfig();
    
    if (empty($stripeConfig['public_key_test']) || strpos($stripeConfig['public_key_test'], 'pk_test_') !== 0) {
        throw new Exception("❌ Clé publique TEST non configurée");
    }
    echo "✅ Clé publique TEST configurée\n";
    
    if (empty($stripeConfig['secret_key_test']) || strpos($stripeConfig['secret_key_test'], 'sk_test_') !== 0) {
        throw new Exception("❌ Clé secrète TEST non configurée");
    }
    echo "✅ Clé secrète TEST configurée\n";
    echo "✅ Mode: " . ($stripeConfig['mode'] ?? 'test') . "\n\n";
    
    // Initialiser la base de données avant le service Stripe
    Database::init($config->getDatabaseConfig());
    
    // Test 2: Service Stripe
    echo "2. Test du service Stripe...\n";
    $stripeService = \App\Services\StripeService::getInstance();
    echo "✅ Service Stripe initialisé\n";
    echo "✅ Mode TEST: " . ($stripeService->isTestMode() ? 'Oui' : 'Non') . "\n";
    
    // Masquer la clé publique pour l'affichage
    $publicKey = $stripeService->getPublicKey();
    $maskedKey = substr($publicKey, 0, 10) . '...' . substr($publicKey, -4);
    echo "✅ Clé publique: $maskedKey\n\n";
    
    // Test 3: Base de données
    echo "3. Test de la base de données...\n";
    Database::init($config->getDatabaseConfig());
    $db = Database::getInstance();
    
    // Vérifier les tables Stripe
    $stmt = $db->prepare("SHOW TABLES LIKE 'stripe_%'");
    $stmt->execute();
    $tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
    
    echo "Tables Stripe trouvées: " . count($tables) . "\n";
    foreach ($tables as $table) {
        echo "  ✅ $table\n";
    }
    
    if (count($tables) < 7) {
        echo "⚠️  Attention: Toutes les tables ne sont pas créées (attendu: 7+)\n";
    }
    echo "\n";
    
    // Test 4: Vérifier les appareils Android certifiés
    echo "4. Test des appareils Android certifiés...\n";
    $stmt = $db->prepare("SELECT COUNT(*) as count FROM stripe_android_certified_devices WHERE tap_to_pay_certified = 1");
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    echo "✅ Appareils Android certifiés: " . $result['count'] . "\n\n";
    
    // Test 5: Test de connexion à l'API Stripe
    echo "5. Test de connexion à l'API Stripe...\n";
    try {
        \Stripe\Stripe::setApiKey($stripeConfig['secret_key_test']);
        $balance = \Stripe\Balance::retrieve();
        echo "✅ Connexion à Stripe réussie!\n";
        echo "   Solde disponible: " . number_format($balance->available[0]->amount / 100, 2) . " " . strtoupper($balance->available[0]->currency) . "\n";
        echo "   Solde en attente: " . number_format($balance->pending[0]->amount / 100, 2) . " " . strtoupper($balance->pending[0]->currency) . "\n";
    } catch (Exception $e) {
        echo "❌ Erreur de connexion Stripe: " . $e->getMessage() . "\n";
    }
    
    echo "\n================================\n";
    echo "✨ Tests terminés avec succès!\n";
    echo "================================\n\n";
    
    echo "Prochaines étapes:\n";
    echo "1. Créer un webhook dans le Dashboard Stripe\n";
    echo "2. Activer Stripe Connect et Terminal\n";
    echo "3. Tester les endpoints via l'app ou Postman\n";
    
} catch (Exception $e) {
    echo "\n❌ ERREUR: " . $e->getMessage() . "\n";
    echo "Trace: " . $e->getTraceAsString() . "\n";
    exit(1);
}