<?php
/**
 * Script de simulation pour tester la logique de retenue des commissions
 * en début de mois et leur traitement le 3ème jour
 */

require_once __DIR__ . '/../vendor/autoload.php';

$app = require_once __DIR__ . '/../bootstrap/app.php';
$app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();

use App\Models\User;
use App\Models\Order;
use App\Models\Commission;
use App\Services\AMMService;
use App\Services\WalletService;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

echo "\n";
echo "╔══════════════════════════════════════════════════════════════════╗\n";
echo "║  SIMULATION - RETENUE DES COMMISSIONS EN DÉBUT DE MOIS          ║\n";
echo "╚══════════════════════════════════════════════════════════════════╝\n\n";

$ammService = new AMMService();

// ========================================
// TEST 1: Vérification de la logique shouldHoldCommission()
// ========================================
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
echo "TEST 1: Logique de retenue selon le jour du mois\n";
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";

// Récupérer un utilisateur de test
$testUser = User::where('role', 'member')->where('is_active', true)->first();

if (!$testUser) {
    echo "❌ Aucun membre actif trouvé pour les tests\n";
    exit(1);
}

echo "Utilisateur de test: {$testUser->name} (ID: {$testUser->id})\n\n";

// Simuler différents jours du mois
$testDays = [1, 2, 3, 15, 28];

echo "Simulation de la fonction shouldHoldCommission() pour différents jours:\n\n";

foreach ($testDays as $day) {
    // On ne peut pas vraiment changer la date système, donc on va tester la logique manuellement
    $shouldHold = $day <= 2;
    $status = $shouldHold ? '🔒 HELD (en attente)' : '✅ PENDING (immédiat)';
    $reason = $shouldHold ? "Début de mois (jour $day) - En attente de vérification AMM le 3" : "Jour normal du mois";
    
    echo "  Jour $day du mois:\n";
    echo "    → Statut: $status\n";
    echo "    → Raison: $reason\n\n";
}

// Tester la fonction réelle avec la date actuelle
echo "Date actuelle: " . now()->format('Y-m-d') . " (Jour " . now()->day . ")\n";
$holdCheck = $ammService->shouldHoldCommission($testUser);
echo "Résultat shouldHoldCommission():\n";
echo "  → should_hold: " . ($holdCheck['should_hold'] ? 'true' : 'false') . "\n";
echo "  → reason: " . ($holdCheck['reason'] ?? 'null') . "\n\n";

// ========================================
// TEST 2: Vérification du statut initial des commissions
// ========================================
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
echo "TEST 2: Statut initial des commissions\n";
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";

$initialStatus = $ammService->getInitialCommissionStatus($testUser);
echo "Statut initial pour une commission créée aujourd'hui: '$initialStatus'\n\n";

// ========================================
// TEST 3: Vérification des constantes du modèle Commission
// ========================================
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
echo "TEST 3: Constantes du modèle Commission\n";
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";

echo "Statuts disponibles:\n";
echo "  • STATUS_PENDING:  '" . Commission::STATUS_PENDING . "'\n";
echo "  • STATUS_APPROVED: '" . Commission::STATUS_APPROVED . "'\n";
echo "  • STATUS_PAID:     '" . Commission::STATUS_PAID . "'\n";
echo "  • STATUS_REJECTED: '" . Commission::STATUS_REJECTED . "'\n";
echo "  • STATUS_HELD:     '" . Commission::STATUS_HELD . "'\n\n";

// ========================================
// TEST 4: Statistiques des commissions actuelles
// ========================================
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
echo "TEST 4: Statistiques des commissions en base\n";
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";

$stats = [
    'total' => Commission::count(),
    'pending' => Commission::where('status', 'pending')->count(),
    'approved' => Commission::where('status', 'approved')->count(),
    'paid' => Commission::where('status', 'paid')->count(),
    'rejected' => Commission::where('status', 'rejected')->count(),
    'held' => Commission::where('status', 'held')->count(),
];

echo "Commissions en base de données:\n";
echo "  • Total:     {$stats['total']}\n";
echo "  • Pending:   {$stats['pending']}\n";
echo "  • Approved:  {$stats['approved']}\n";
echo "  • Paid:      {$stats['paid']}\n";
echo "  • Rejected:  {$stats['rejected']}\n";
echo "  • HELD:      {$stats['held']} ← Commissions en attente\n\n";

// ========================================
// TEST 5: Simulation d'une commission en attente
// ========================================
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
echo "TEST 5: Simulation de création d'une commission\n";
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";

// Trouver un parrain avec un filleul
$sponsor = User::whereHas('referrals')->where('is_active', true)->first();

if ($sponsor) {
    echo "Parrain trouvé: {$sponsor->name} (ID: {$sponsor->id})\n";
    
    // Vérifier son AMM
    $ammActive = $ammService->isAmmActive($sponsor);
    echo "AMM Active: " . ($ammActive ? 'OUI ✓' : 'NON ✗') . "\n";
    
    $ammStatus = $ammService->getAmmStatus($sponsor);
    echo "Progression AMM: {$ammStatus['progress']['percentage']}%\n";
    echo "Achats personnels: " . number_format($ammStatus['progress']['personal_purchases'], 0, ',', ' ') . " XOF\n";
    echo "Ventes boutique: " . number_format($ammStatus['progress']['shop_sales'], 0, ',', ' ') . " XOF\n";
    echo "Requis: " . number_format($ammStatus['progress']['required'], 0, ',', ' ') . " XOF\n\n";
    
    // Simuler ce qui se passerait si on créait une commission aujourd'hui
    $initialStatus = $ammService->getInitialCommissionStatus($sponsor);
    echo "Si une commission était créée MAINTENANT (jour " . now()->day . "):\n";
    echo "  → Statut initial: '$initialStatus'\n";
    
    if ($initialStatus === 'held') {
        echo "  → La commission serait mise en ATTENTE\n";
        echo "  → Elle serait traitée le 3 " . now()->addMonth()->translatedFormat('F Y') . " à 06h00\n";
        echo "  → Le parrain a jusqu'au 2 pour faire son AMM\n";
    } else {
        echo "  → La commission serait traitée IMMÉDIATEMENT\n";
        if ($ammActive) {
            echo "  → Le wallet du parrain serait crédité\n";
        } else {
            echo "  → ATTENTION: AMM inactive, la commission ne serait PAS créditée!\n";
        }
    }
} else {
    echo "❌ Aucun parrain avec filleuls trouvé pour la simulation\n";
}

// ========================================
// TEST 6: Simulation du traitement le 3ème jour
// ========================================
echo "\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
echo "TEST 6: Simulation du traitement des commissions held\n";
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";

$heldCommissions = Commission::where('status', 'held')->with(['user', 'fromUser'])->get();

if ($heldCommissions->isEmpty()) {
    echo "Aucune commission en attente (held) en base de données.\n\n";
    
    echo "Créons une commission de test en statut 'held'...\n\n";
    
    // Créer une commission de test
    $testSponsor = User::where('role', 'member')
        ->where('is_active', true)
        ->where('subscription_paid', true)
        ->first();
    
    if ($testSponsor) {
        $testOrder = Order::where('payment_status', 'paid')->latest()->first();
        
        if ($testOrder) {
            DB::beginTransaction();
            
            $testCommission = Commission::create([
                'user_id' => $testSponsor->id,
                'order_id' => $testOrder->id,
                'from_user_id' => $testOrder->user_id,
                'type' => 'level1',
                'level' => 1,
                'amount' => 1000, // Commission de test
                'status' => 'held',
                'description' => '[TEST] Commission de test - En attente de vérification AMM'
            ]);
            
            echo "✓ Commission de test créée (ID: {$testCommission->id})\n";
            echo "  → Parrain: {$testSponsor->name}\n";
            echo "  → Montant: 1 000 XOF\n";
            echo "  → Statut: held\n\n";
            
            // Simuler le traitement
            echo "Simulation du traitement le 3ème jour:\n\n";
            
            $ammActive = $ammService->isAmmActive($testSponsor);
            echo "  Vérification AMM de {$testSponsor->name}: " . ($ammActive ? 'ACTIVE ✓' : 'INACTIVE ✗') . "\n";
            
            if ($ammActive) {
                echo "  → Résultat: Commission APPROUVÉE et wallet crédité\n";
            } else {
                echo "  → Résultat: Commission REJETÉE (AMM inactive)\n";
            }
            
            // Annuler la transaction de test
            DB::rollBack();
            echo "\n⚠️  Transaction annulée (test uniquement)\n";
        } else {
            echo "❌ Aucune commande payée trouvée pour le test\n";
        }
    } else {
        echo "❌ Aucun parrain actif avec abonnement trouvé\n";
    }
} else {
    echo "Commissions en attente trouvées: {$heldCommissions->count()}\n\n";
    
    foreach ($heldCommissions as $commission) {
        $sponsor = $commission->user;
        $ammActive = $ammService->isAmmActive($sponsor);
        
        echo "Commission #{$commission->id}:\n";
        echo "  → Parrain: {$sponsor->name} (ID: {$sponsor->id})\n";
        echo "  → Montant: " . number_format($commission->amount, 0, ',', ' ') . " XOF\n";
        echo "  → AMM Active: " . ($ammActive ? 'OUI ✓' : 'NON ✗') . "\n";
        echo "  → Résultat si traité maintenant: " . ($ammActive ? 'APPROUVÉ' : 'REJETÉ') . "\n\n";
    }
}

// ========================================
// TEST 7: Vérification de la planification
// ========================================
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
echo "TEST 7: Vérification de la planification (Kernel)\n";
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";

echo "Commandes planifiées:\n";
echo "  • amm:reset-monthly         → 1er de chaque mois à 00:00\n";
echo "  • commissions:process-held  → 3ème de chaque mois à 06:00\n\n";

// ========================================
// RÉSUMÉ
// ========================================
echo "╔══════════════════════════════════════════════════════════════════╗\n";
echo "║                       RÉSUMÉ DE LA SIMULATION                    ║\n";
echo "╚══════════════════════════════════════════════════════════════════╝\n\n";

$today = now();
echo "Date actuelle: " . $today->translatedFormat('l d F Y') . " (Jour " . $today->day . ")\n\n";

if ($today->day <= 2) {
    echo "🔒 PÉRIODE DE RETENUE ACTIVE\n";
    echo "   Les commissions créées aujourd'hui seront mises en attente.\n";
    echo "   Elles seront traitées le 3 " . $today->translatedFormat('F Y') . " à 06h00.\n";
} else {
    echo "✅ PÉRIODE NORMALE\n";
    echo "   Les commissions sont traitées immédiatement.\n";
    echo "   La vérification AMM est faite au moment de la création.\n";
}

echo "\n";
echo "Prochaine exécution de commissions:process-held:\n";
$nextThird = $today->day >= 3 ? $today->copy()->addMonth()->day(3) : $today->copy()->day(3);
echo "  → " . $nextThird->translatedFormat('l d F Y') . " à 06:00\n\n";

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
echo "SIMULATION TERMINÉE\n";
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";
