<?php

namespace App\Console\Commands;

use App\Models\Episode;
use App\Models\Season;
use App\Models\Subtitle;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

/**
 * FixSubtitleMismatch
 *
 * Anizium altyazı bug'ı: episode 1'in altyazısı diğer bölümlere yanlışlıkla kaydedilmiş olabilir.
 * Altyazı URL'sindeki name=s1_b1_XX parametresini kontrol eder; yanlış bölüme işaret edenleri siler.
 *
 * Kullanım:
 *   php artisan animexe:fix-subtitles                # Yanlış altyazıları sil
 *   php artisan animexe:fix-subtitles --dry-run      # Sadece listele
 *   php artisan animexe:fix-subtitles --anime-id=42  # Sadece bu anime
 */
class FixSubtitleMismatch extends Command
{
    protected $signature = 'animexe:fix-subtitles
                            {--dry-run : Silmeden önce listele}
                            {--anime-id= : Sadece bu anime_id\'yi kontrol et}';

    protected $description = 'Anizium altyazı bölüm uyuşmazlığı bug\'ını düzelt (name parametresi yanlış episode\'a işaret eden altyazıları sil)';

    public function handle(): int
    {
        $dryRun  = $this->option('dry-run');
        $animeId = $this->option('anime-id');

        $this->info("Anizium Altyazı Uyuşmazlık Düzeltici");
        $this->info("=====================================");
        if ($dryRun) $this->warn("DRY-RUN modu — hiçbir şey silinmeyecek");

        $query = Subtitle::query()
            ->join('episodes', 'subtitles.episode_id', '=', 'episodes.id')
            ->join('seasons',  'seasons.id',           '=', 'episodes.season_id')
            ->whereNotNull('subtitles.url')
            ->where('subtitles.url', 'like', '%anizium%')
            ->select(
                'subtitles.id as subtitle_id',
                'subtitles.episode_id',
                'subtitles.language',
                'subtitles.url',
                'seasons.season_number',
                'episodes.episode_number',
                'episodes.anime_id',
            );

        if ($animeId) {
            $query->where('episodes.anime_id', (int) $animeId);
        }

        $subtitles = $query->get();
        $this->info("Kontrol edilecek Anizium altyazısı: {$subtitles->count()}");

        $mismatchIds = [];

        foreach ($subtitles as $sub) {
            $url       = $sub->url;
            $season    = (int) $sub->season_number;
            $episode   = (int) $sub->episode_number;
            $lang      = $sub->language;

            // URL'den name parametresini çıkar
            $parsed = parse_url($url);
            if (!isset($parsed['query'])) continue;

            parse_str($parsed['query'], $params);
            $name = $params['name'] ?? '';

            if (!$name) continue;

            // Beklenen: s{season}_b{episode}_{lang}
            $expectedPrefix = "s{$season}_b{$episode}_";
            if (!str_starts_with($name, $expectedPrefix)) {
                $mismatchIds[] = $sub->subtitle_id;
                $this->line(
                    "[MISMATCH] sub_id={$sub->subtitle_id} "
                    . "anime_id={$sub->anime_id} "
                    . "S{$season}E{$episode} {$lang} "
                    . "| name={$name} "
                    . "(beklenen prefix: {$expectedPrefix})"
                );
            }
        }

        $this->newLine();
        $this->info("Uyuşmazlık bulunan: " . count($mismatchIds));

        if (empty($mismatchIds)) {
            $this->info("Düzeltilecek altyazı bulunamadı.");
            return 0;
        }

        if ($dryRun) {
            $this->warn("--dry-run: {" . count($mismatchIds) . "} altyazı silinecekti.");
            return 0;
        }

        $deleted = Subtitle::whereIn('id', $mismatchIds)->delete();
        $this->info("Silindi: {$deleted} yanlış altyazı.");
        $this->info("Botları yeniden çalıştırarak doğru altyazıları yeniden indirebilirsiniz.");
        $this->info("  python anizium_scraper/bot2_upload.py --daemon");

        return 0;
    }
}
