<?php

namespace App\Console\Commands;

use App\Jobs\CollectDnsZoneStatistics;
use App\Models\DnsZone;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class DispatchDnsStatisticsCollection extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'dns:dispatch-statistics 
        {--date= : Data pentru care să colecteze statistici (Y-m-d), default: ieri}
        {--limit=20 : Număr maxim de zone per dispatch}
        {--priority= : Filtrează după prioritate (high/normal/low)}
        {--force : Forțează re-colectarea chiar dacă există deja statistici}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Dispatch jobs în queue pentru colectare statistici DNS (scalabil pentru 100+ zone)';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $date = $this->option('date') ?? Carbon::yesterday()->format('Y-m-d');
        $limit = (int)$this->option('limit');
        $force = $this->option('force');

        $this->info("🚀 Dispatch statistici DNS pentru data: {$date}");
        $this->info("📊 Limit per dispatch: {$limit} zone");

        // query pentru zonă care au nevoie de colectare
        $query = DnsZone::where('sync_to_powerdns', true)
            ->whereNotNull('powerdns_zone_id');

        // Filtrare după prioritate (dacă este specificată)
        if ($this->option('priority')) {
            $query->where('priority', $this->option('priority'));
            $this->info("🎯 Filtrare prioritate: {$this->option('priority')}");
        }

        // Exclude zonele care au deja statistici (dacă nu e --force)
        if (!$force) {
            $query->whereNotExists(function($q) use ($date) {
                $q->select(\DB::raw(1))
                  ->from('dns_zone_statistics')
                  ->whereColumn('dns_zone_statistics.domain', 'dns_zones.domain')
                  ->where('dns_zone_statistics.statistic_date', $date)
                  ->whereNull('dns_zone_statistics.nameserver_id'); // Doar statistici agregate
            });
        }

        // Aplică limit și obține zonele
        $zones = $query->limit($limit)->get();

        if ($zones->isEmpty()) {
            $this->info('✅ Nu există zone pentru colectare (toate zonele au deja statistici pentru această dată).');
            return 0;
        }

        $this->info("📦 Găsite {$zones->count()} zone pentru colectare");

        // Dispatch jobs în queue
        $bar = $this->output->createProgressBar($zones->count());
        $bar->start();

        $dispatched = 0;
        foreach ($zones as $zone) {
            try {
                CollectDnsZoneStatistics::dispatch($zone, $date)
                    ->onQueue('dns-statistics'); // Queue dedicat
                
                $dispatched++;
                $bar->advance();
            } catch (\Exception $e) {
                $this->error("\n❌ Eroare la dispatch pentru {$zone->domain}: " . $e->getMessage());
                Log::error("Eroare dispatch job pentru {$zone->domain}", [
                    'error' => $e->getMessage(),
                    'zone_id' => $zone->id
                ]);
            }
        }

        $bar->finish();
        $this->newLine(2);

        $this->info("✅ {$dispatched} joburi adăugate în queue 'dns-statistics'");
        $this->info("💡 Joburile vor fi procesate de workers în paralel");
        
        Log::info("Dispatch statistici DNS completat", [
            'date' => $date,
            'zones_dispatched' => $dispatched,
            'limit' => $limit,
            'force' => $force
        ]);

        return 0;
    }
}
