<?php

namespace App\Console\Commands;

use App\Services\NameserverHealthService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class CheckNameserverHealth extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'nameservers:health-check
                            {--sync : Sincronizează automat când nameserver-ul revine online}
                            {--force : Forțează verificarea chiar dacă statusul nu s-a schimbat}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Verifică statusul tuturor nameserver-elor și sincronizează zonele când acestea revin online';

    /**
     * Execute the console command.
     */
    public function handle(NameserverHealthService $healthService): int
    {
        $this->info('🔍 Verificare status nameservere...');
        $this->newLine();

        $startTime = microtime(true);
        $recoveredNameservers = $healthService->checkAllNameservers();
        $checkDuration = round((microtime(true) - $startTime) * 1000);

        // Afișează rezultatele
        $nameservers = \App\Models\NameServer::where('is_active', true)->get();

        $this->table(
            ['Nameserver', 'Status', 'Ultima verificare'],
            $nameservers->map(function ($ns) {
                $statusIcon = $ns->status === 'online' ? '✅' : '❌';
                return [
                    $ns->name,
                    "{$statusIcon} {$ns->status}",
                    $ns->last_check?->diffForHumans() ?? 'Niciodată',
                ];
            })
        );

        $this->newLine();
        $this->info("⏱️  Verificare completă în {$checkDuration}ms");

        // Dacă au fost nameservere recuperate și opțiunea --sync este activă
        if (!empty($recoveredNameservers) && $this->option('sync')) {
            $this->newLine();
            $this->warn('🔄 Nameservere recuperate detectate! Încep sincronizarea...');

            foreach ($recoveredNameservers as $nameserver) {
                $this->info("  → Procesez {$nameserver->name}...");

                // Adaugă zonele în coadă
                $queued = $healthService->queueAllZonesForNameserver($nameserver);
                $this->info("    ✓ {$queued} zone adăugate în coada de sincronizare");

                // Procesează coada imediat
                $results = $healthService->processPendingSync($nameserver);
                $this->info("    ✓ Procesate: {$results['processed']}, Succes: {$results['success']}, Eșuate: {$results['failed']}");

                if (!empty($results['errors'])) {
                    foreach (array_slice($results['errors'], 0, 3) as $error) {
                        $this->error("      ⚠ {$error}");
                    }
                    if (count($results['errors']) > 3) {
                        $this->warn("      ... și încă " . (count($results['errors']) - 3) . " erori");
                    }
                }
            }

            Log::info('Nameserver health check completed with sync', [
                'recovered_count' => count($recoveredNameservers),
                'recovered_names' => collect($recoveredNameservers)->pluck('name')->toArray(),
            ]);
        }

        // Afișează statistici coadă
        $stats = $healthService->getQueueStats();
        if ($stats['pending'] > 0 || $stats['failed'] > 0) {
            $this->newLine();
            $this->info('📊 Statistici coadă sincronizare:');
            $this->table(
                ['Pending', 'În procesare', 'Eșuate', 'Completate azi', 'Reîncercabile'],
                [[$stats['pending'], $stats['processing'], $stats['failed'], $stats['completed_today'], $stats['retryable']]]
            );
        }

        return Command::SUCCESS;
    }
}
