<?php

namespace App\Console\Commands;

use App\Models\ImportJob;
use App\Models\Anime;
use Illuminate\Console\Command;
use Illuminate\Support\Str;

/**
 * CreateCrossImportJobs
 *
 * Yayınlanan animeler için çapraz kaynak job'ları oluşturur:
 *   • Anizium import'u olan ama AnimeCix import'u olmayan anime → AnimeCix job (watch_id bilgisi Python'dan)
 *   • AnimeCix import'u olan ama Anizium import'u olmayan anime → Anizium job (watch_id bilgisi job'lardan)
 *   • Her iki kaynakta da done job'u olan anime → bölüm bazlı video_sources yenileme için
 *     yeni job (done job'u "pending" yaparak botu yeniden çalıştırır)
 *
 * Kullanım:
 *   php artisan animexe:cross-import               # İki kaynakta da eksik job'ları oluştur
 *   php artisan animexe:cross-import --force       # Var olan done job'larını da yeniden kuyruğa al
 *   php artisan animexe:cross-import --only=anizium  # Sadece Anizium job'larını oluştur
 *   php artisan animexe:cross-import --only=animecix # Sadece AnimeCix job'larını oluştur
 */
class CreateCrossImportJobs extends Command
{
    protected $signature = 'animexe:cross-import
                            {--force : Mevcut done job\'larını yeniden pending yap}
                            {--only= : Sadece belirtilen kaynağı oluştur (anizium|animecix)}
                            {--dry-run : Job oluşturmadan listele}';

    protected $description = 'Mevcut animeler için eksik kaynak job\'larını oluşturur (Anizium ↔ AnimeCix çapraz import)';

    public function handle(): int
    {
        $force   = $this->option('force');
        $only    = $this->option('only');
        $dryRun  = $this->option('dry-run');

        $this->info("Animexe Çapraz Import Job Oluşturucu");
        $this->info("====================================");

        // Tüm yayınlanan animeleri job durumlarıyla al
        $animes = Anime::where('is_published', true)
            ->with('importJobs')
            ->get();

        $this->info("Toplam yayınlanan anime: {$animes->count()}");

        $aniziumCreated  = 0;
        $animecixCreated = 0;
        $skipped         = 0;
        $requeued        = 0;

        foreach ($animes as $anime) {
            $jobs         = $anime->importJobs;
            $aniziumJobs  = $jobs->where('source', 'anizium');
            $animecixJobs = $jobs->where('source', 'animecix');

            $hasAniziumDone  = $aniziumJobs->where('status', 'done')->isNotEmpty();
            $hasAnimecixDone = $animecixJobs->where('status', 'done')->isNotEmpty();
            $hasAniziumAny   = $aniziumJobs->whereIn('status', ['pending','fetching','downloading','uploading','done'])->isNotEmpty();
            $hasAnimecixAny  = $animecixJobs->whereIn('status', ['pending','fetching','downloading','uploading','done'])->isNotEmpty();

            // ── Re-queue: ikisi de done olan animeleri yeniden işlet ──────────
            if ($force && $hasAniziumDone && $hasAnimecixDone) {
                if (!$dryRun) {
                    // En son done Anizium job'unu yeniden pending yap
                    $aj = $aniziumJobs->where('status', 'done')->sortByDesc('id')->first();
                    if ($aj) {
                        $aj->update(['status' => 'pending', 'done_episodes' => 0, 'error_log' => null, 'current_step' => 'Çapraz re-import']);
                    }
                    // En son done AnimeCix job'unu yeniden pending yap
                    $cj = $animecixJobs->where('status', 'done')->sortByDesc('id')->first();
                    if ($cj) {
                        $cj->update(['status' => 'pending', 'done_episodes' => 0, 'error_log' => null, 'current_step' => 'Çapraz re-import']);
                    }
                    $requeued++;
                } else {
                    $this->line("[DRY] Re-queue: {$anime->title} (her iki kaynak mevcut)");
                }
                continue;
            }

            // ── Anizium job oluştur ───────────────────────────────────────────
            if ((!$only || $only === 'anizium') && !$hasAniziumAny) {
                // Anizium watch_id'yi bilmiyoruz — Python reimport_all.py bu görevi üstlenir.
                // Buradan sadece anime_id'yi atayarak "ihtiyaç listesi" oluşturabiliriz;
                // watch_id olmadan bot job'ı işleyemez. Bu yüzden sadece logluyoruz.
                $this->warn("[SKIP-ANİZİUM] {$anime->title} (watch_id bilinmiyor — reimport_all.py kullan)");
                $skipped++;
            }

            // ── AnimeCix job oluştur ──────────────────────────────────────────
            if ((!$only || $only === 'animecix') && !$hasAnimecixAny) {
                // animecix_title_id'yi bilmiyoruz — daemon.py bunu otomatik keşfeder.
                $this->warn("[SKIP-ANİMECİX] {$anime->title} (title_id bilinmiyor — daemon.py kullan)");
                $skipped++;
            }

            // ── Anizium'u olan ama AnimeCix'i olmayan: Anizium job'larından watch_id var ──
            // ─ (bu zaten mevcut) ─

            // ── AnimeCix'i olan ama Anizium'u olmayan: watch_id bilinmiyorsa skip ──
            if ((!$only || $only === 'anizium') && $hasAnimecixDone && !$hasAniziumAny) {
                // AnimeCix'te var ama Anizium'da yok — reimport_all.py Anizium katalogunda arayacak
                $this->line("[ANİZİUM-GEREKLİ] {$anime->title} (MAL: {$anime->mal_id}) — reimport_all.py işleyecek");
            }

            // ── Anizium'u olan ama AnimeCix'i olmayan: daemon.py katalog taramasında otomatik bulur ──
            if ((!$only || $only === 'animecix') && $hasAniziumDone && !$hasAnimecixAny) {
                $this->line("[ANİMECİX-GEREKLİ] {$anime->title} (MAL: {$anime->mal_id}) — daemon.py bulacak");
            }
        }

        // ── Var olan Anizium done job'larını yeniden pending yap (--force) ───
        if ($force && !$dryRun) {
            $this->info("Re-queue tamamlandı: {$requeued} anime");
        }

        $this->newLine();
        $this->info("Özet:");
        $this->info("  Anizium job oluşturuldu : {$aniziumCreated}");
        $this->info("  AnimeCix job oluşturuldu: {$animecixCreated}");
        $this->info("  Yeniden kuyruğa alındı  : {$requeued}");
        $this->info("  Atlandı (watch_id yok)  : {$skipped}");
        $this->newLine();
        $this->info("Tüm anime + kaynak eşleştirmesi için: python reimport_all.py");

        return 0;
    }
}
