import os
import sys
import time
from pathlib import Path
from typing import Optional
from rich.console import Console
from rich.panel import Panel
from rich.progress import BarColumn, Progress, SpinnerColumn, TextColumn, TimeRemainingColumn
from rich.prompt import Confirm, IntPrompt, Prompt
from rich.table import Table

from config import (
    DEFAULT_VIDEA_CHUNK_SIZE_MB,
    DEFAULT_VIDEA_CONCURRENCY,
    DEFAULT_VK_CHUNK_SIZE_MB,
)
from database import (
    delete_account,
    get_account_by_id,
    get_accounts,
    get_all_videos_with_details,
    get_saved_series_list,
    get_series_episodes_from_db,
    get_setting,
    init_db,
    save_account,
    set_setting,
    update_account_status,
)
from episode_parser import extract_season_episode, scan_directory_for_episodes
from mozisarok_client import MozisarokClient
from providers import get_provider, list_available_providers
from queue_manager import UploadQueueManager

console = Console()
mozisarok = MozisarokClient()
queue_mgr = UploadQueueManager(videa_concurrency=DEFAULT_VIDEA_CONCURRENCY)


def clear_screen():
    os.system("cls" if os.name == "nt" else "clear")


def print_header():
    console.print(
        Panel(
            "[bold cyan]🎬 Mozisarok Videó Feltöltő Kliens[/bold cyan]\n"
            "[dim]Videa.hu (nem listázott, több fiók, párhuzamosítás) | VK.com (embed) | MySQL Pool (4 conn)[/dim]",
            border_style="cyan",
        )
    )


# 1. Check Tokens / Mozisarok Auth
def menu_auth():
    clear_screen()
    print_header()
    console.print("\n[bold yellow]🔐 Mozisarok Hitelesítés[/bold yellow]")

    token = get_setting("mozisarok_token")
    if token:
        console.print(f"Jelenlegi mentett token: [dim]{token[:20]}...[/dim]")
        with console.status("Token érvényességének ellenőrzése..."):
            valid = mozisarok.validate_token(token)
        if valid:
            console.print("[bold green]✅ A token érvényes és működik![/bold green]")
        else:
            console.print("[bold red]❌ A mentett token érvénytelen vagy lejárt.[/bold red]")
    else:
        console.print("[dim]Nincs mentett Mozisarok token.[/dim]")

    console.print("\nLehetőségek:")
    console.print("1. Bejelentkezés felhasználónévvel és jelszóval")
    console.print("2. JWT Token manuális beillesztése")
    console.print("0. Vissza a főmenübe")

    choice = Prompt.ask("Válassz", choices=["1", "2", "0"], default="0")
    if choice == "1":
        user = Prompt.ask("Mozisarok felhasználónév")
        passwd = Prompt.ask("Mozisarok jelszó", password=True)
        with console.status("Bejelentkezés..."):
            tok = mozisarok.login(user, passwd)
        if tok:
            console.print("[bold green]✅ Sikeres bejelentkezés! Token elmentve a MySQL-be.[/bold green]")
        else:
            console.print("[bold red]❌ Hibás felhasználónév vagy jelszó.[/bold red]")
        Prompt.ask("\nNyomj Entert a folytatáshoz...")
    elif choice == "2":
        tok = Prompt.ask("Illeszd be a JWT tokent")
        if tok:
            valid = mozisarok.validate_token(tok)
            if valid:
                mozisarok.set_token(tok)
                console.print("[bold green]✅ Token érvényes és elmentve![/bold green]")
            else:
                console.print("[bold red]❌ A megadott token érvénytelen.[/bold red]")
        Prompt.ask("\nNyomj Entert a folytatáshoz...")


# 2. Manage Provider Accounts (Videa multi-account & VK)
def menu_accounts():
    while True:
        clear_screen()
        print_header()
        console.print("\n[bold yellow]👥 Szolgáltató Fiókok Kezelése (Videa több fiók & VK)[/bold yellow]")

        accounts = get_accounts()
        table = Table(title="Regisztrált Fiókok")
        table.add_column("ID", style="cyan")
        table.add_column("Szolgáltató", style="magenta")
        table.add_column("Fiók Neve", style="white")
        table.add_column("Felhasználó / Email", style="yellow")
        table.add_column("Státusz", style="green")

        if not accounts:
            table.add_row("—", "—", "Nincsenek fiókok", "—", "—")
        else:
            for acc in accounts:
                status = "[green]Aktív[/green]" if acc["is_active"] else "[red]Inaktív[/red]"
                table.add_row(
                    str(acc["id"]),
                    acc["provider"].upper(),
                    acc["name"],
                    acc["username"] or "Token alapú",
                    status,
                )
        console.print(table)

        console.print("\n1. Új Videa fiók hozzáadása")
        console.print("2. Új VK fiók hozzáadása")
        console.print("3. Fiók hitelesítésének ellenőrzése / bejelentkeztetés")
        console.print("4. Fiók törlése")
        console.print("0. Vissza a főmenübe")

        choice = Prompt.ask("Válassz", choices=["1", "2", "3", "4", "0"], default="0")
        if choice == "0":
            break
        elif choice == "1":
            name = Prompt.ask("Fiók elnevezése (pl. Videa Fiók 1)")
            user = Prompt.ask("Videa email cím")
            passwd = Prompt.ask("Videa jelszó", password=True)
            acc_id = save_account("videa", name, username=user, password=passwd)
            # Test login immediately
            with console.status("Videa bejelentkezés tesztelése..."):
                acc = get_account_by_id(acc_id)
                prov = get_provider("videa")
                ok = prov.validate_credentials(acc)
                update_account_status(acc_id, 1 if ok else 0)
            if ok:
                console.print(f"[bold green]✅ Videa fiók sikeresen hozzáadva és hitelesítve![/bold green]")
            else:
                console.print(f"[bold yellow]⚠️ Fiók mentve, de a bejelentkezés sikertelen volt. Ellenőrizd az adatokat.[/bold yellow]")
            Prompt.ask("\nNyomj Entert...")
        elif choice == "2":
            name = Prompt.ask("Fiók elnevezése (pl. VK Fő Fiók)")
            tok = Prompt.ask("VK Access Token")
            grp = Prompt.ask("Közösség ID (opcionális, üresen hagyható)", default="")
            extra = {"group_id": int(grp)} if grp.strip() else None
            acc_id = save_account("vk", name, token=tok, extra_data=extra)
            with console.status("VK token ellenőrzése..."):
                acc = get_account_by_id(acc_id)
                prov = get_provider("vk")
                ok = prov.validate_credentials(acc)
                update_account_status(acc_id, 1 if ok else 0)
            if ok:
                console.print(f"[bold green]✅ VK fiók sikeresen hitelesítve és mentve![/bold green]")
            else:
                console.print(f"[bold red]❌ A megadott VK token érvénytelen.[/bold red]")
            Prompt.ask("\nNyomj Entert...")
        elif choice == "3":
            acc_id = IntPrompt.ask("Add meg a tesztelendő fiók ID-ját")
            acc = get_account_by_id(acc_id)
            if not acc:
                console.print("[red]Nem létezik ilyen fiók.[/red]")
            else:
                with console.status("Fiók ellenőrzése..."):
                    prov = get_provider(acc["provider"])
                    ok = prov.validate_credentials(acc)
                    update_account_status(acc_id, 1 if ok else 0)
                if ok:
                    console.print(f"[bold green]✅ {acc['name']} sikeresen hitelesítve![/bold green]")
                else:
                    console.print(f"[bold red]❌ {acc['name']} hitelesítése sikertelen.[/bold red]")
            Prompt.ask("\nNyomj Entert...")
        elif choice == "4":
            acc_id = IntPrompt.ask("Törlendő fiók ID-ja")
            delete_account(acc_id)
            console.print("[bold green]Fiók törölve.[/bold green]")
            Prompt.ask("\nNyomj Entert...")


# 3. Search & Pre-assign upload
def menu_search_and_add():
    clear_screen()
    print_header()
    console.print("\n[bold yellow]🔍 Mozisarok Keresés & Feltöltési Hozzárendelés[/bold yellow]")

    query = Prompt.ask("Film vagy sorozat címe")
    if not query.strip():
        return

    with console.status("Keresés Mozisarok-on..."):
        results = mozisarok.search(query.strip())

    if not results:
        console.print("[yellow]Nem található találat.[/yellow]")
        Prompt.ask("Nyomj Entert...")
        return

    table = Table(title=f"Találatok erre: '{query}'")
    table.add_column("#", style="cyan")
    table.add_column("Cím", style="white")
    table.add_column("Típus", style="magenta")
    table.add_column("Kiadási év", style="green")
    table.add_column("Értékelés", style="yellow")
    table.add_column("TMDB ID", style="dim")

    for i, item in enumerate(results, start=1):
        table.add_row(
            str(i),
            item.get("title") or item.get("name", "N/A"),
            "Sorozat (TV)" if item.get("media_type") == "tv" else "Film",
            str(item.get("release_date") or item.get("first_air_date") or "N/A"),
            str(round(item.get("vote_average", 0), 1)),
            str(item.get("id") or item.get("tmdb_id")),
        )
    console.print(table)

    selected_idx = IntPrompt.ask("Válaszd ki a számot (1-" + str(len(results)) + ", 0=mégsem)", default=0)
    if selected_idx < 1 or selected_idx > len(results):
        return

    selected_item = results[selected_idx - 1]
    title = selected_item.get("title") or selected_item.get("name")
    is_tv = selected_item.get("media_type") == "tv"
    console.print(f"\n[bold green]Kiválasztva: {title} ({selected_item.get('media_type')})[/bold green]")

    file_or_folder = Prompt.ask("Feltöltendő videófájl VAGY mappa útvonala (pl. D:/video.mp4 vagy D:/Series/Season1)")
    path_obj = Path(file_or_folder.strip().strip('"').strip("'"))
    if not path_obj.exists():
        console.print(f"[bold red]❌ Az útvonal nem található: {path_obj}[/bold red]")
        Prompt.ask("Nyomj Entert...")
        return

    provider = Prompt.ask("Szolgáltató", choices=["videa", "vk"], default="videa")

    # Select account
    accs = get_accounts(provider=provider, active_only=True)
    account_id = None
    if accs:
        console.print("Választható fiókok:")
        for a in accs:
            console.print(f"[{a['id']}] {a['name']} ({a['username'] or 'Token'})")
        acc_choice = Prompt.ask("Fiók ID (vagy üres az első aktívhoz)", default=str(accs[0]["id"]))
        if acc_choice.isdigit():
            account_id = int(acc_choice)

    lang = Prompt.ask("Nyelv", default="Magyar")
    sub = Prompt.ask("Felirat (ha van, pl. Magyar)", default="")
    sub = sub if sub.strip() else None
    qual = Prompt.ask("Minőség", choices=["1080p", "720p", "4K", "480p", "CAM"], default="1080p")

    # Case A: Folder batch mode for series
    if path_obj.is_dir():
        episodes = scan_directory_for_episodes(str(path_obj.resolve()))
        if not episodes:
            console.print(f"[bold red]❌ Nem található videófájl ebben a mappában: {path_obj}[/bold red]")
            Prompt.ask("Nyomj Entert...")
            return

        table = Table(title=f"Felismert Epizódok a mappában ({len(episodes)} db)")
        table.add_column("#", style="cyan")
        table.add_column("Fájlnév", style="white")
        table.add_column("Évad", style="green")
        table.add_column("Epizód", style="yellow")
        table.add_column("Méret", style="dim")

        for idx, ep in enumerate(episodes, 1):
            size_mb = f"{ep['file_size'] / (1024*1024):.1f} MB"
            table.add_row(
                str(idx),
                ep["file_name"],
                f"S{ep['season']:02d}" if ep["season"] is not None else "—",
                f"E{ep['episode']:02d}" if ep["episode"] is not None else "—",
                size_mb,
            )
        console.print(table)

        if Confirm.ask(f"Hozzáadod mind a(z) {len(episodes)} epizódot a feltöltési sorhoz?", default=True):
            file_paths = [ep["file_path"] for ep in episodes]
            task_ids = queue_mgr.add_batch_tasks(
                media_data=selected_item,
                file_paths=file_paths,
                provider=provider,
                account_id=account_id,
                language=lang,
                subtitle=sub,
                quality=qual,
            )
            console.print(f"[bold green]✅ Sikeresen hozzáadva {len(task_ids)} db feladat a sorhoz![/bold green]")
        Prompt.ask("\nNyomj Entert...")
        return

    # Case B: Single file mode
    season, episode = None, None
    if is_tv:
        detected_s, detected_e = extract_season_episode(path_obj.name)
        def_s = detected_s if detected_s is not None else 1
        def_e = detected_e if detected_e is not None else 1
        if detected_s and detected_e:
            console.print(f"[bold cyan]🔍 Fájlnévből automatikusan felismert: Season {detected_s}, Episode {detected_e}[/bold cyan]")
        season = IntPrompt.ask("Hanyadik évad (Season)?", default=def_s)
        episode = IntPrompt.ask("Hanyadik epizód (Episode)?", default=def_e)

    # Add to queue
    try:
        task_id = queue_mgr.add_task(
            media_data=selected_item,
            file_path=str(path_obj.resolve()),
            provider=provider,
            account_id=account_id,
            season=season,
            episode=episode,
            language=lang,
            subtitle=sub,
            quality=qual,
        )
        console.print(f"[bold green]✅ Sikeresen hozzáadva a várakozási sorhoz! (Feladat ID: #{task_id})[/bold green]")
    except Exception as e:
        console.print(f"[bold red]❌ Hiba: {e}[/bold red]")

    Prompt.ask("\nNyomj Entert...")


# 4. View Queue & Start Execution
def menu_queue():
    while True:
        clear_screen()
        print_header()
        console.print("\n[bold yellow]📋 Feltöltési Várakozási Sor[/bold yellow]")

        items = queue_mgr.get_queue_status()
        status_text = "[bold green]FUT[/bold green]" if queue_mgr.is_running else "[bold yellow]ÁLL (Várakozik manuális indításra)[/bold yellow]"
        
        v_mb = get_setting("videa_chunk_size_mb", str(DEFAULT_VIDEA_CHUNK_SIZE_MB))
        vk_mb = get_setting("vk_chunk_size_mb", str(DEFAULT_VK_CHUNK_SIZE_MB))
        up_videa = queue_mgr.get_videa_uploading_count()
        up_vk = queue_mgr.get_vk_uploading_count()
        conv_cnt = queue_mgr.get_videa_converting_count()
        console.print(
            f"Állapot: {status_text} | Videa feltöltés: [cyan]{up_videa}/{queue_mgr.videa_concurrency}[/cyan] | "
            f"VK feltöltés: [magenta]{up_vk}/{queue_mgr.vk_concurrency}[/magenta] | "
            f"Videa konvertálás: [yellow]{conv_cnt}/{queue_mgr.max_videa_converting}[/yellow] | "
            f"Szelet: [cyan]Videa {v_mb} MB[/cyan] / [magenta]VK {vk_mb} MB[/magenta]\n"
        )

        table = Table()
        table.add_column("#", style="cyan")
        table.add_column("Cím / Adatlap", style="white")
        table.add_column("Fájlnév", style="dim")
        table.add_column("Cél", style="magenta")
        table.add_column("Státusz", style="yellow")
        table.add_column("Haladás", style="green")

        if not items:
            table.add_row("—", "A sor üres", "—", "—", "—", "—")
        else:
            for item in items:
                table.add_row(
                    str(item["id"]),
                    item["media_title"],
                    item["file_name"],
                    item["provider"].upper(),
                    item["status"],
                    f"{item['progress']}%",
                )
        console.print(table)

        console.print("\n1. ▶️ Feltöltés Indítása manuálisan")
        console.print("2. ⏸️ Feltöltési Sor Szüneteltetése")
        console.print("3. ⚙️ Videa egyidejű feltöltések számának módosítása")
        console.print("4. 💾 Szeletméretek módosítása (Videa & VK Chunk Size MB)")
        console.print("5. 🧹 Kész feladatok eltávolítása a sorból")
        console.print("6. 🗑️ Feladat megszakítása / törlése a sorból")
        console.print("7. 🔄 Félbeszakadt folyamatok visszaállítása az adatbázisból (Crash recovery)")
        console.print("8. ⚡ Kényszerített manuális ellenőrzés egy feladatra (Force check)")
        console.print("9. 🔄 Képernyő frissítése")
        console.print("0. Vissza a főmenübe")

        choice = Prompt.ask("Válassz", choices=["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"], default="9")
        if choice == "0":
            break
        elif choice == "1":
            queue_mgr.start_queue()
            console.print("[bold green]Feltöltési sor elindítva![/bold green]")
            time.sleep(1)
        elif choice == "2":
            queue_mgr.stop_queue()
            console.print("[yellow]Feltöltési sor megállítva.[/yellow]")
            time.sleep(1)
        elif choice == "3":
            conc = IntPrompt.ask("Hány videó töltődjön fel egyszerre Videa-ra?", default=queue_mgr.videa_concurrency)
            queue_mgr.set_videa_concurrency(conc)
            console.print(f"[green]Párhuzamosítás beállítva: {conc}[/green]")
            time.sleep(1)
        elif choice == "4":
            cur_v = int(get_setting("videa_chunk_size_mb", str(DEFAULT_VIDEA_CHUNK_SIZE_MB)))
            cur_vk = int(get_setting("vk_chunk_size_mb", str(DEFAULT_VK_CHUNK_SIZE_MB)))
            new_v = IntPrompt.ask("Videa szeletméret (MB)", default=cur_v)
            new_vk = IntPrompt.ask("VK szeletméret (MB)", default=cur_vk)
            set_setting("videa_chunk_size_mb", str(max(1, new_v)))
            set_setting("vk_chunk_size_mb", str(max(1, new_vk)))
            console.print(f"[bold green]✅ Beállítva: Videa {new_v} MB, VK {new_vk} MB[/bold green]")
            time.sleep(1)
        elif choice == "5":
            queue_mgr.clear_completed()
            console.print("[green]Befejezett feladatok törölve a sorból.[/green]")
            time.sleep(1)
        elif choice == "6":
            task_id = IntPrompt.ask("Törlendő / megszakítandó feladat ID-ja")
            removed = queue_mgr.remove_task(task_id)
            if removed:
                console.print(f"[bold green]✅ Feladat #{task_id} megszakítva és törölve a sorból.[/bold green]")
            else:
                console.print(f"[bold yellow]⚠️ Feladat #{task_id} nem található a sorban.[/bold yellow]")
            time.sleep(1.5)
        elif choice == "7":
            with console.status("Rendszerállapot visszaállítása az adatbázisból..."):
                summary = queue_mgr.recover_from_database(run_in_background=False)
            console.print(f"[bold green]✅ Visszaállítás befejeződött![/bold green]")
            console.print(f" - Félbeszakadt feltöltések várakozóra állítva: {summary.get('uploading_paused', 0)}")
            console.print(f" - Ellenőrzés alatt álló videók lezárva: {summary.get('verifying_completed', 0)}")
            console.print(f" - Konvertált / beküldött videók: {summary.get('converting_completed', 0)}")
            console.print(f" - Várakozó feladatok visszatöltve: {summary.get('queued_restored', 0)}")
            time.sleep(2.5)
        elif choice == "8":
            task_id = IntPrompt.ask("Kényszerítendő videó / feladat ID-ja")
            with console.status(f"Videó #{task_id} ellenőrzése és lezárása folyamatban..."):
                res = queue_mgr.force_check_video(task_id)
            if res.get("success"):
                console.print(f"[bold green]✅ {res.get('message')}[/bold green]")
            else:
                console.print(f"[bold yellow]⚠️ {res.get('message') or res.get('error')}[/bold yellow]")
            Prompt.ask("\nNyomj Entert a folytatáshoz...")


# 5. MySQL History
def menu_history():
    clear_screen()
    print_header()
    console.print("\n[bold yellow]🗄️ MySQL Adatbázisban Mentett Feltöltések[/bold yellow]\n")

    videos = get_all_videos_with_details()
    table = Table(title="Mentett Adatlapok és Feltöltött Videók")
    table.add_column("ID", style="cyan")
    table.add_column("Cím", style="white")
    table.add_column("Állapot", style="bold cyan")
    table.add_column("Szolgáltató", style="magenta")
    table.add_column("Használt Fiók", style="yellow")
    table.add_column("Embed Link", style="blue")
    table.add_column("Mozisarok", style="green")
    table.add_column("Ellenőrizve", style="green")

    if not videos:
        table.add_row("—", "Nincsenek mentett rekordok", "—", "—", "—", "—", "—", "—")
    else:
        for v in videos:
            table.add_row(
                str(v["id"]),
                v["media_title"],
                v.get("status") or "várakozik",
                v["provider"].upper(),
                v.get("account_name") or "Alapértelmezett",
                (v.get("embed_url") or "—")[:35] + ("..." if len(v.get("embed_url") or "") > 35 else ""),
                "✅" if v["mozisarok_submitted"] else "❌",
                "✅" if v["mozisarok_verified"] else "⏳",
            )
    console.print(table)
    console.print("\n1. ⚡ Kényszerített manuális ellenőrzés és lezárás (Force check)")
    console.print("2. 📤 Film vagy egyedi videó embed link újrabeküldése (Mozisarok meglét ellenőrzéssel)")
    console.print("3. 📺 Sorozat összes részének beküldése (Mozisarok ellenőrzés & csak a hiányzók)")
    console.print("0. Vissza a főmenübe")
    act = Prompt.ask("Válassz", choices=["1", "2", "3", "0"], default="0")
    if act == "1":
        v_id = IntPrompt.ask("Add meg az ellenőrizendő videó ID-ját")
        with console.status(f"Videó #{v_id} ellenőrzése és lezárása folyamatban..."):
            res = queue_mgr.force_check_video(v_id)
        if res.get("success"):
            console.print(f"[bold green]✅ {res.get('message')}[/bold green]")
        else:
            console.print(f"[bold yellow]⚠️ {res.get('message') or res.get('error')}[/bold yellow]")
        Prompt.ask("\nNyomj Entert a folytatáshoz...")
    elif act == "2":
        v_id = IntPrompt.ask("Add meg az újrabeküldendő mentett videó ID-ját")
        with console.status(f"Videó #{v_id} ellenőrzése a Mozisarok-on..."):
            res = queue_mgr.resubmit_video_to_mozisarok(v_id, force=False)
        if res.get("success"):
            if res.get("already_exists"):
                console.print(f"[bold yellow]ℹ️ {res.get('message')}[/bold yellow]")
                if Confirm.ask("A link már aktív a Mozisarok-on. Mégis újra be szeretnéd küldeni (kényszerített felülírás)?", default=False):
                    with console.status("Kényszerített újrabeküldés folyamatban..."):
                        force_res = queue_mgr.resubmit_video_to_mozisarok(v_id, force=True)
                    if force_res.get("success"):
                        console.print(f"[bold green]✅ {force_res.get('message')}[/bold green]")
                    else:
                        console.print(f"[bold red]❌ {force_res.get('error')}[/bold red]")
            else:
                console.print(f"[bold green]✅ {res.get('message')}[/bold green]")
        else:
            console.print(f"[bold red]❌ {res.get('error')}[/bold red]")
        Prompt.ask("\nNyomj Entert a folytatáshoz...")
    elif act == "3":
        series_list = get_saved_series_list()
        if not series_list:
            console.print("[bold yellow]Nincsenek még mentett sorozat epizódok az adatbázisban.[/bold yellow]")
            Prompt.ask("\nNyomj Entert a folytatáshoz...")
            return

        s_table = Table(title="Adatbázisban Mentett Sorozatok")
        s_table.add_column("TMDb ID", style="cyan")
        s_table.add_column("Cím", style="bold white")
        s_table.add_column("Mentett Részek", style="yellow")
        s_table.add_column("Évadok", style="green")

        for s in series_list:
            seasons_str = ", ".join(str(x) for x in s.get("seasons", [])) or "—"
            s_table.add_row(
                str(s["tmdb_id"]),
                s["title"],
                f"{s['total_episodes']} db",
                seasons_str,
            )
        console.print(s_table)

        chosen_tmdb = IntPrompt.ask("\nAdd meg a beküldendő sorozat TMDb ID-ját")
        season_filter_str = Prompt.ask("Évad szűrés (Hagyd üresen vagy írj 0-t az összes évadhoz)", default="0")
        season_filter = int(season_filter_str) if season_filter_str.isdigit() and int(season_filter_str) > 0 else None

        only_missing = Confirm.ask("Csak a hiányzó részeket küldje be? (Ha már fent van Mozisarok-on, kihagyja)", default=True)
        force = False
        if not only_missing:
            force = Confirm.ask("Kényszerített beküldés (meglévő linkek felülírása/újraküldése)?", default=False)

        with console.status("Sorozat epizódok ellenőrzése és beküldése Mozisarok-ra..."):
            batch_res = queue_mgr.check_and_submit_series_batch(
                tmdb_id=chosen_tmdb,
                season=season_filter,
                only_missing=only_missing,
                force=force,
            )

        if batch_res.get("success"):
            console.print(f"\n[bold green]✅ {batch_res.get('message')}[/bold green]\n")
            res_table = Table(title="Epizódok Állapota")
            res_table.add_column("Rész", style="cyan")
            res_table.add_column("Fájlnév", style="white")
            res_table.add_column("Embed Link", style="blue")
            res_table.add_column("Mozisarok", style="bold green")
            res_table.add_column("Eredmény", style="yellow")

            for ep in batch_res.get("episodes", []):
                res_table.add_row(
                    f"S{ep['season']:02d}E{ep['episode']:02d}",
                    ep.get("file_name", "—")[:25],
                    (ep.get("embed_url") or "—")[:30] + ("..." if len(ep.get("embed_url") or "") > 30 else ""),
                    "✅ Fent van" if ep.get("mozisarok_found") else "⏳ Hiányzik",
                    ep.get("message", ""),
                )
            console.print(res_table)
        else:
            console.print(f"[bold red]❌ Hiba: {batch_res.get('error')}[/bold red]")

        Prompt.ask("\nNyomj Entert a folytatáshoz...")


def main_cli():
    try:
        init_db()
    except Exception as e:
        console.print(f"[bold red]Adatbázis hiba: {e}[/bold red]")

    while True:
        clear_screen()
        print_header()
        console.print("\n[bold]Főmenü:[/bold]")
        console.print("1. [cyan]🔐 Tokenek ellenőrzése / Mozisarok bejelentkezés[/cyan]")
        console.print("2. [cyan]👥 Szolgáltató fiókok kezelése (Videa több fiók, VK)[/cyan]")
        console.print("3. [cyan]🔍 Keresés Mozisarok-on & Videó hozzáadása a sorhoz[/cyan]")
        console.print("4. [cyan]📋 Várakozási sor megtekintése & Indítás (Queue)[/cyan]")
        console.print("5. [cyan]🗄️ MySQL Adatbázis rekordok és előzmények[/cyan]")
        console.print("6. [green]🌐 Webes Felület Indítása (FastAPI http://localhost:8000)[/green]")
        console.print("0. Kilépés")

        choice = Prompt.ask("\nVálassz egy menüpontot", choices=["1", "2", "3", "4", "5", "6", "0"], default="1")
        if choice == "1":
            menu_auth()
        elif choice == "2":
            menu_accounts()
        elif choice == "3":
            menu_search_and_add()
        elif choice == "4":
            menu_queue()
        elif choice == "5":
            menu_history()
        elif choice == "6":
            import uvicorn
            console.print("\n[bold green]Webes felület indítása a következő címen: http://localhost:8000[/bold green]")
            console.print("[dim]Megnyitás böngészőben: http://localhost:8000 | Leállítás: Ctrl+C[/dim]\n")
            uvicorn.run("app:app", host="0.0.0.0", port=8000, reload=False)
        elif choice == "0":
            console.print("\nViszlát!")
            sys.exit(0)


if __name__ == "__main__":
    main_cli()
