<?php

namespace App\Console\Commands;

use App\Models\User;
use App\Models\Setting;
use App\Services\AMMService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Notification;
use App\Notifications\AmmReminderNotification;

/**
 * Commande pour envoyer des rappels AMM aux membres
 * 
 * Cette commande est exécutée automatiquement selon la planification:
 * - Le 15 du mois à 09:00 (premier rappel - milieu de mois)
 * - Le 25 du mois à 09:00 (deuxième rappel - urgence)
 * - Le 28 du mois à 18:00 (rappel final - dernière chance)
 * 
 * Planification: schedule:run dans le cron à chaque minute
 */
class SendAmmReminders extends Command
{
    /**
     * The name and signature of the console command.
     */
    protected $signature = 'amm:send-reminders 
                            {--type=mid : Type de rappel (mid, urgent, final)}
                            {--dry-run : Simuler sans envoyer les notifications}
                            {--user= : Envoyer à un utilisateur spécifique (ID)}';

    /**
     * The console command description.
     */
    protected $description = 'Envoyer des rappels AMM aux membres qui n\'ont pas encore atteint leur objectif mensuel';

    /**
     * Execute the console command.
     */
    public function handle(AMMService $ammService)
    {
        $isDryRun = $this->option('dry-run');
        $type = $this->option('type');
        $specificUserId = $this->option('user');
        
        $now = now();
        $ammAmount = Setting::get('amm_amount', 15000);
        $currency = Setting::get('currency', 'FCFA');
        
        $this->info('=== Rappels AMM (' . strtoupper($type) . ') ===');
        $this->info('Date: ' . $now->format('d/m/Y H:i:s'));
        $this->info('Montant AMM requis: ' . number_format($ammAmount) . ' ' . $currency);
        
        if ($isDryRun) {
            $this->warn('Mode simulation activé - aucun email ne sera envoyé.');
        }

        // Récupérer tous les membres actifs qui n'ont pas atteint l'AMM
        $query = User::where('role', 'member')
            ->where('is_active', true)
            ->whereNotNull('email_verified_at');
        
        if ($specificUserId) {
            $query->where('id', $specificUserId);
        }
        
        $members = $query->get();
        
        $stats = [
            'total_checked' => 0,
            'already_completed' => 0,
            'exempted' => 0,
            'advance_paid' => 0,
            'reminders_sent' => 0,
            'errors' => 0,
        ];
        
        $this->output->progressStart($members->count());
        
        foreach ($members as $member) {
            $stats['total_checked']++;
            $this->output->progressAdvance();
            
            try {
                // Vérifier si le membre est exonéré
                if ($member->amm_exemption_until && $member->amm_exemption_until >= $now) {
                    $stats['exempted']++;
                    continue;
                }
                
                // Vérifier si le membre a payé d'avance
                $endOfMonth = $now->copy()->endOfMonth();
                if ($member->amm_advance_paid_until && $member->amm_advance_paid_until >= $endOfMonth) {
                    $stats['advance_paid']++;
                    continue;
                }
                
                // Calculer les achats du mois en cours
                $ammStatus = $ammService->getAmmStatus($member);
                
                if ($ammStatus['is_compliant']) {
                    $stats['already_completed']++;
                    continue;
                }
                
                // Calculer le montant restant
                $remaining = $ammAmount - $ammStatus['current_month_purchases'];
                $percentage = $ammStatus['percentage'];
                $daysRemaining = $now->daysUntil($now->copy()->endOfMonth());
                
                // Envoyer le rappel
                if (!$isDryRun) {
                    $this->sendReminder($member, [
                        'type' => $type,
                        'remaining' => $remaining,
                        'percentage' => $percentage,
                        'current_purchases' => $ammStatus['current_month_purchases'],
                        'amm_amount' => $ammAmount,
                        'currency' => $currency,
                        'days_remaining' => $daysRemaining,
                        'month' => $now->translatedFormat('F Y'),
                    ]);
                }
                
                $stats['reminders_sent']++;
                
                Log::info('Rappel AMM envoyé', [
                    'user_id' => $member->id,
                    'email' => $member->email,
                    'type' => $type,
                    'remaining' => $remaining,
                    'percentage' => $percentage,
                ]);
                
            } catch (\Exception $e) {
                $stats['errors']++;
                Log::error('Erreur lors de l\'envoi du rappel AMM', [
                    'user_id' => $member->id,
                    'error' => $e->getMessage(),
                ]);
            }
        }
        
        $this->output->progressFinish();
        
        // Afficher les statistiques
        $this->newLine();
        $this->info('=== Statistiques ===');
        $this->table(
            ['Métrique', 'Valeur'],
            [
                ['Total membres vérifiés', $stats['total_checked']],
                ['AMM déjà complété', $stats['already_completed']],
                ['Exonérés', $stats['exempted']],
                ['Avance payée', $stats['advance_paid']],
                ['Rappels envoyés', $stats['reminders_sent']],
                ['Erreurs', $stats['errors']],
            ]
        );
        
        // Log global
        Log::info('Exécution des rappels AMM terminée', [
            'type' => $type,
            'dry_run' => $isDryRun,
            'stats' => $stats,
        ]);
        
        if ($stats['errors'] > 0) {
            return Command::FAILURE;
        }
        
        return Command::SUCCESS;
    }
    
    /**
     * Envoyer le rappel à un membre
     */
    protected function sendReminder(User $member, array $data): void
    {
        // Créer la notification
        $notification = new AmmReminderNotification($data);
        
        // Envoyer via le système de notifications Laravel
        $member->notify($notification);
    }
}
