# wcs/search_dialog.py
import xbmc
import xbmcgui
import xbmcaddon
import xbmcplugin
import requests
import xml.etree.ElementTree as ET
from urllib.parse import quote_plus, unquote
import re
import threading

from wcs.webshare import WebshareClient as webshare_api
from wcs import utils
from wcs.utils import (
    extract_clean_title, 
    format_size, 
    calculate_rating,
)
from wcs.search.SeriesSearch import do_webshare_search_with_retry
from wcs.search import ranking
from wcs.playback.DialogMediaInfoWithGame import get_autoplay_manager
from wcs.ui import UI as ui  # Import pro popinfo funkci
from wcs.ui.chip_strip import chip_strip

def format_quality_with_color(quality):
    """Formátuje kvalitu s barevným kódováním pro Kodi."""
    if not quality:
        return ""
    
    # Barevné schéma pro kvality
    color_map = {
        '4K': 'FFFF4444',      # Červená pro 4K
        'REMUX': 'FFFF00FF',   # Magenta pro REMUX
        '1080p': 'FF44AAFF',   # Modrá pro 1080p
        '720p': 'FFFF9944',    # Oranžová pro 720p
        '480p': 'FFDDDD44',    # Žlutá pro 480p
        '360p': 'FFAA8844',    # Hnědá pro 360p
        'SD': 'FF999999'       # Šedá pro SD
    }
    
    # Najdi barvu pro kvalitu
    color = color_map.get(quality, 'FFFFFFFF')  # Bílá jako fallback
    
    # Vrať kvalitu s tečkou a barevným formátováním
    return f"• [COLOR {color}]{quality}[/COLOR]"


class SearchDialog(xbmcgui.WindowXMLDialog):
    """
    Dialogové okno pro zobrazení výsledků vyhledávání z Webshare.
    Používá search/DialogWcsSearch.xml.
    """
    def __init__(self, xml_filename, addon_path, *args, **kwargs):
        self.xml_filename = xml_filename # Uložíme si jméno XML pro pozdější logiku
        # Layout je v 1080i - Kodi ho automaticky škáluje na 720p obrazovky
        super().__init__(xml_filename, addon_path, "Default", "1080i")
        # Uložíme si naše kwargs
        self.search_query = kwargs.get('search_query', '')
        self.movie_title = kwargs.get('movie_title', '')
        self.movie_year = kwargs.get('movie_year', '')
        self.poster_url = kwargs.get('poster_url', '')  # Přidáno pro poster
        self.rating = kwargs.get('rating', '')         # Hodnocení filmu
        self.genre = kwargs.get('genre', '')           # Žánr filmu
        self.director = kwargs.get('director', '')     # Režisér
        self.runtime = kwargs.get('runtime', '')       # Délka filmu
        self.plot = kwargs.get('plot', '')            # Přidaný plot pro film
        self.addon = xbmcaddon.Addon()
        # Možnost předat už připravené výsledky
        self.search_results = kwargs.get('search_results', [])
        self.selected_result = None
        
        # Autoplay podpora
        self.is_episode = kwargs.get('is_episode', False)
        self.series_name = kwargs.get('series_name', '')
        self.season_number = kwargs.get('season_number', None)
        self.episode_number = kwargs.get('episode_number', None)
        self.tmdb_id = kwargs.get('tmdb_id', None)
        self.autoplay_manager = get_autoplay_manager()
        
        # Vlastní stav autoplay přepínače - načteme z globálního nastavení
        # Ale pouze pro epizody a pokud je to povoleno globálně
        # POZN: Autoplay funguje POUZE pro seriály z knihovny (natvrdo nastaveno)
        self.autoplay_enabled = (
            self.is_episode and 
            self.addon.getSettingBool('autoplay_enabled_global') and
            True  # Autoplay POUZE pro knihovnu - natvrdo nastaveno
        )
        
        # Nový parametr
        self.preferred_quality = kwargs.get('preferred_quality', None)
        self.from_library = kwargs.get('from_library', False)
        self.fanart_url = kwargs.get('fanart_url', '') # Přidáno pro fanart
        self.episode_title = kwargs.get('episode_title', '') # Přidáno pro název epizody
        self.episode_thumb = kwargs.get('episode_thumb', '') # Still epizody pro úvodní dialog
        
        
        # Nový parametr pro manuální vyhledávání
        self.manual_search = kwargs.get('manual_search', False)

        # Režim pravého panelu: 'play' = výběr řádku přehraje, 'download' = stáhne
        self.mode = kwargs.get('mode', 'play')

        # Automatické přehrání prvního řádku po odpočtu (s); jakákoliv klávesa odpočet zruší
        self.autoplay_countdown = int(kwargs.get('autoplay_countdown') or 0)
        self._countdown_cancel = threading.Event()
        self._countdown_running = False
        
    def onInit(self):
        """
        Volá se při inicializaci okna. Zde načteme výsledky vyhledávání a naplníme seznam.
        """
        xbmc.log(f"[plugin.video.milionar] Initializing SearchDialog for query: {self.search_query}", level=xbmc.LOGINFO)
        if not self.search_query:
            xbmc.log("[plugin.video.milionar] Error: Empty search query for SearchDialog.", level=xbmc.LOGERROR)
            self.close()
            return

        self.setProperty('WCS.Search.Mode', self.mode)

        # Nastavíme texty v dialogu
        dialog_title = f"Hledaný výraz: {self.search_query}"
        self.setProperty('WCS.Search.Title', dialog_title)

        info_text = f"Hledaný výraz: {self.search_query}"
        self.setProperty('WCS.Search.Info', info_text)

        # Nastavíme poster do dialogu – vždy poster seriálu (UI), ne still epizody
        if hasattr(self, 'poster_url') and self.poster_url:
            self.setProperty('WCS.Search.Poster', self.poster_url)
        else:
            self.setProperty('WCS.Search.Poster', '')

        # Nastavíme název filmu/seriálu (MovieTitle)
        if hasattr(self, 'movie_title') and self.movie_title:
            self.setProperty('WCS.Search.MovieTitle', self.movie_title)
        else:
            self.setProperty('WCS.Search.MovieTitle', '')

        # Nastavíme fanart, pokud je k dispozici (předpokládáme, že je v self.fanart_url)
        fanart_url = getattr(self, 'fanart_url', '')
        if fanart_url:
            self.setProperty('WCS.Search.Fanart', fanart_url)
        else:
            self.setProperty('WCS.Search.Fanart', '')

        # Nastavíme metadata filmu
        if hasattr(self, 'rating') and self.rating:
            try:
                rating_val = float(self.rating)
                rating_str = f"{rating_val:.1f}/10"
            except Exception:
                rating_str = str(self.rating)
            self.setProperty('WCS.Search.Rating', rating_str)
        else:
            self.setProperty('WCS.Search.Rating', '')

        if hasattr(self, 'genre') and self.genre:
            self.setProperty('WCS.Search.Genre', self.genre)
        else:
            self.setProperty('WCS.Search.Genre', '')

        if hasattr(self, 'director') and self.director:
            self.setProperty('WCS.Search.Director', self.director)
        else:
            self.setProperty('WCS.Search.Director', '')

        if hasattr(self, 'runtime') and self.runtime:
            self.setProperty('WCS.Search.Runtime', self.runtime)
        else:
            self.setProperty('WCS.Search.Runtime', '')

        # Nastavíme rok, pokud byl předán
        if hasattr(self, 'movie_year') and self.movie_year:
            self.setProperty('WCS.Search.Year', self.movie_year)
        else:
            self.setProperty('WCS.Search.Year', '')

        # Plný popis; na celé řádky nad tlačítky ho zkrátí _layout_info_column
        self._plot_text = getattr(self, 'plot', '') or ''
        
        # Specifika pro manuální vyhledávání
        if self.manual_search:
            # V manuálním režimu chceme jako titulek vidět jen hledaný výraz a informaci o zdroji
            self.setProperty('WCS.Search.MovieTitle', f"Webshare: {self.search_query}")
            self.setProperty('WCS.Search.Info', f"Hledaný výraz: {self.search_query}")
            
            # Nastavíme ikonu doplňku jako poster
            addon_icon = 'special://home/addons/plugin.video.milionar/resources/media/brand/milionar-mark.png'
            self.setProperty('WCS.Search.Poster', addon_icon)
            
            # Nastavíme popis na informaci o přímém vyhledávání
            self._plot_text = (f"Zobrazeny jsou výsledky přímého vyhledávání souborů na serveru Webshare.cz pro výraz '{self.search_query}'. "
                               "Tyto výsledky neobsahují metadata z filmových databází (TMDb).")
            
            # Skryjeme ostatní metadata, která by mohla být matoucí
            self.setProperty('WCS.Search.Rating', '')
            self.setProperty('WCS.Search.Genre', 'Toto je přímé vyhledávání souborů na Webshare.cz')
            self.setProperty('WCS.Search.Director', '')
            self.setProperty('WCS.Search.Runtime', '')
            self.setProperty('WCS.Search.Year', '')
        
        # Autoplay nastavení pro epizody
        if self.is_episode:
            self.setProperty('WCS.Episode.IsEpisode', 'true')
            self.setProperty('WCS.Episode.FromLibrary', 'true' if self.from_library else 'false')
            # Nastavení výchozího stavu a labelu
            self._update_autoplay_label()
            xbmc.log(f"[plugin.video.milionar] Episode detected: {self.series_name} S{self.season_number}E{self.episode_number}", level=xbmc.LOGINFO)
        else:
            self.setProperty('WCS.Episode.IsEpisode', 'false')
            self.setProperty('WCS.Episode.FromLibrary', 'false')
            # Nastavení informačního textu pro filmy
            self._update_autoplay_label()
        
        # Logování metadat z knihovny při zobrazení dialogu pro epizodu
        if self.is_episode:
            xbmc.log(
                f"[plugin.video.milionar] Library metadata: series='{self.series_name}', season={self.season_number}, episode={self.episode_number}, tmdb_id={self.tmdb_id}, movie_title='{self.movie_title}', movie_year='{self.movie_year}'",
                level=xbmc.LOGINFO
            )

        # Nastavíme název epizody jako property, pokud je k dispozici
        if hasattr(self, 'episode_title') and self.episode_title:
            self.setProperty('WCS.Search.EpisodeTitle', self.episode_title)
        else:
            self.setProperty('WCS.Search.EpisodeTitle', '')

        # Podtitulek (SxxExx · název epizody / rok u filmu) a meta řádek
        self.setProperty('WCS.Search.Subtitle', self._compose_subtitle())
        self.setProperty('WCS.Search.MetaLine', self._compose_meta_line())
        self.setProperty('WCS.Search.ShowPlot', 'true')
        self._layout_info_column()

        # Zobrazíme indikátor načítání
        xbmc.executebuiltin("ActivateWindow(busydialognocancel)")

        # Získáme výsledky z Webshare - jen pokud nejsou už předané
        if not self.search_results:
            self.search_results = self._perform_search()
        
        # Jedno řazení pro dialog, chipy i autoplay (wcs/search/ranking.py)
        if self.search_results:
            self.search_results = self._rank(self.search_results)

        # Skryjeme indikátor načítání
        xbmc.executebuiltin("Dialog.Close(busydialognocancel)")

        if not self.search_results:
            # Zobrazit chybu a zavřít okno, pokud se výsledky nepodařilo načíst
            xbmcgui.Dialog().ok("Žádné výsledky", "Nepodařilo se najít žádné odpovídající soubory na Webshare.")
            self.close()
            return

        # Naplníme seznam výsledků
        self._populate_results_list()

        # Naplníme akční tlačítka (pill-shaped list)
        self._populate_action_buttons()

        # Nastavíme fokus na akční tlačítka nebo Seznam
        xbmc.sleep(100)  # Krátká pauza, aby se UI stihlo aktualizovat
        
        # Fokus na seznam výsledků (50); starší XML s akčním listem 103 mají prioritu
        try:
            self.getControl(103)
            use_action_list = "DialogAIChatSearch.xml" not in (self.xml_filename or "")
        except Exception:
            use_action_list = False
        if use_action_list:
            self.setFocusId(103)  # Akční tlačítka (starší XML)
        else:
            self.setFocusId(50)  # Seznam streamů

        if self.autoplay_countdown > 0 and self.mode == 'play':
            self._countdown_running = True
            threading.Thread(target=self._countdown_worker, daemon=True).start()

    def _countdown_worker(self):
        """Odpočet v hlavičce; po doběhnutí přehraje první řádek (jen property a close, žádné kontrolky)."""
        template = self.addon.getLocalizedString(32147)
        for remaining in range(self.autoplay_countdown, 0, -1):
            self.setProperty('WCS.Search.Subtitle', template.format(remaining))
            if self._countdown_cancel.wait(1):
                return
        self._countdown_running = False
        first = self.search_results[0]
        self.selected_result = {'ident': first.get('ident', ''), 'name': first.get('name', ''),
                                'provider': first.get('provider', 'webshare')}
        xbmc.log(f"[plugin.video.milionar] SearchDialog: countdown finished, playing {first.get('name')}", level=xbmc.LOGINFO)
        self._handle_autoplay_and_close()

    def _cancel_countdown(self):
        """Uživatel zasáhl: odpočet končí a dialog zůstává jako běžný výběr."""
        if self._countdown_running and not self._countdown_cancel.is_set():
            self._countdown_cancel.set()
            self._countdown_running = False
            self.setProperty('WCS.Search.Subtitle', self._compose_subtitle())
            xbmc.log("[plugin.video.milionar] SearchDialog: autoplay countdown cancelled by user", level=xbmc.LOGINFO)

    # Levý info sloupec (grouplist 119 v search/DialogWcsSearch.xml), skin px
    INFO_COLUMN_WIDTH = 501
    INFO_COLUMN_HEIGHT = 498
    LOGO_MAX_HEIGHT = 120
    LOGO_TOP_SPACER = 12
    GAP_AFTER_TITLE = 18
    GAP_AFTER_SUBTITLE = 8
    META_HEIGHT = 40
    GAP_AFTER_META = 26

    def _layout_info_column(self):
        """Logo místo názvu (je-li na TMDb), texty zkrácené na celé řádky, děj vyplní místo nad tlačítky."""
        from wcs.ui import text_fit
        try:
            logo_control = self.getControl(120)
            plot_control = self.getControl(124)
        except RuntimeError:
            return  # jiné XML se stejnou třídou (např. AI chat) tento sloupec nemá
        width = self.INFO_COLUMN_WIDTH

        logo = None if self.manual_search else self._resolve_logo()
        if logo:
            aspect = logo.get('aspect') or 3.0
            logo_height = int(min(self.LOGO_MAX_HEIGHT, width / aspect))
            logo_control.setHeight(logo_height)
            self.setProperty('WCS.Search.Logo', logo['url'])
            used = self.LOGO_TOP_SPACER + logo_height
        else:
            self.setProperty('WCS.Search.Logo', '')
            title = text_fit.fit(self.getProperty('WCS.Search.MovieTitle'), 'font45_title', width, 2)
            self.setProperty('WCS.Search.MovieTitle', title)
            used = text_fit.block_height(text_fit.line_count(title, 'font45_title', width), 'font45_title')
        used += self.GAP_AFTER_TITLE

        # U filmu je rok už v meta řádku -- podtitul vlevo jen u epizod
        subtitle = text_fit.fit(self._compose_subtitle(), 'font32', width, 2) if self.is_episode else ''
        self.setProperty('WCS.Search.InfoSubtitle', subtitle)
        if subtitle:
            used += text_fit.block_height(text_fit.line_count(subtitle, 'font32', width), 'font32')
            used += self.GAP_AFTER_SUBTITLE
        used += self.META_HEIGHT + self.GAP_AFTER_META

        lines = text_fit.lines_for_height(self.INFO_COLUMN_HEIGHT - used, 'font27')
        self.setProperty('WCS.Search.Plot', text_fit.fit(self._plot_text, 'font27', width, lines))
        plot_control.setHeight(max(1, text_fit.block_height(lines, 'font27')))
        xbmc.log(f"[plugin.video.milionar] SearchDialog layout: logo={'yes' if logo else 'no'}, "
                 f"plot_lines={lines}, used={used}px", level=xbmc.LOGINFO)

    def _resolve_logo(self):
        """Logo seriálu/filmu z TMDb; tmdb_id se u knihovny dohledá (uniqueid, pak vyhledání)."""
        try:
            from wcs.metadata.TMDbLogo import resolve_logo
            media_type = 'tv' if self.is_episode else 'movie'
            title = (self.series_name if self.is_episode else '') or self.movie_title
            year = '' if self.is_episode else self.movie_year
            return resolve_logo(media_type, self.tmdb_id, title, year)
        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] SearchDialog: logo lookup failed: {e}", level=xbmc.LOGWARNING)
            return None

    def _compose_subtitle(self):
        """Sestaví podtitulek dialogu (SxxExx · název epizody / u filmu hledaný název a rok)."""
        if self.is_episode:
            season_episode = ''
            if self.season_number is not None and self.episode_number is not None:
                try:
                    season_episode = f"S{int(self.season_number):02d}E{int(self.episode_number):02d}"
                except (TypeError, ValueError):
                    season_episode = ''
            title = (self.episode_title or '').strip()
            if not title or title == f"Epizoda {self.episode_number}":
                return season_episode
            if season_episode:
                return f"{season_episode} · {title}"
            return title
        searched = (self.search_query if self.manual_search else self.movie_title) or self.search_query or ''
        if self.movie_year and not self.manual_search and str(self.movie_year) not in searched:
            return f"{searched} ({self.movie_year})"
        return searched

    def _compose_meta_line(self):
        """Sestaví meta řádek (rok, žánr, délka, hodnocení) s barvami pro nový design."""
        parts = []
        for value in (self.movie_year, self.genre, self.runtime):
            if value:
                parts.append(f'[COLOR FFB0B0B8]{value}[/COLOR]')
        text = '  '.join(parts)
        if self.rating:
            try:
                rating = f"{float(self.rating):.1f}/10"
            except (TypeError, ValueError):
                rating = str(self.rating)
            stars = f'[COLOR FFF2DD56]★ {rating}[/COLOR]'
            text = f"{text}  {stars}" if text else stars
        return text

    def _toggle_plot(self):
        """Přepne zobrazení popisu v levé kartě."""
        showing = self.getProperty('WCS.Search.ShowPlot') == 'true'
        self.setProperty('WCS.Search.ShowPlot', 'false' if showing else 'true')
        xbmc.log(f"[plugin.video.milionar] SearchDialog: Plot visibility toggled to {not showing}", level=xbmc.LOGINFO)

    def _perform_search(self):
        """Provede vyhledávání podle zapnutých providerů."""
        
        # Zjistit zapnuté providery
        webshare_enabled = self.addon.getSettingBool('webshare_enabled')
        kraska_enabled = self.addon.getSettingBool('kraska_enabled')
        
        xbmc.log(f'[SearchDialog] _perform_search: webshare={webshare_enabled}, kraska={kraska_enabled}', xbmc.LOGINFO)
        
        # Kontrola: žádný provider zapnutý
        if not webshare_enabled and not kraska_enabled:
            dialog = xbmcgui.Dialog()
            if dialog.yesno(
                self.addon.getLocalizedString(33034),  # "Není zapnutý žádný poskytovatel"
                self.addon.getLocalizedString(33035)   # "Prosím zapněte..."
            ):
                self.addon.openSettings()
            return []
        
        all_results = []
        
        # Vyhledání přes Webshare
        if webshare_enabled:
            ws_results = self._perform_search_webshare()
            for item in ws_results:
                if 'provider' not in item:
                    item['provider'] = 'webshare'
            all_results.extend(ws_results)
            xbmc.log(f'[SearchDialog] Webshare: found {len(ws_results)} files', xbmc.LOGINFO)
        
        # Vyhledání přes KRA.sk
        if kraska_enabled:
            kr_results = self._perform_search_kraska()
            for item in kr_results:
                if 'provider' not in item:
                    item['provider'] = 'kraska'
            all_results.extend(kr_results)
            xbmc.log(f'[SearchDialog] KRA.sk: found {len(kr_results)} files', xbmc.LOGINFO)
        
        return self._rank(all_results)

    # Nastavení 'Preferovaná kvalita' (autoplay_preferred_quality) -> kvalita z ranking.QUALITIES
    PREFERRED_QUALITY_SETTING = {1: '4K', 2: '1080p', 3: '720p', 4: '480p', 5: '360p', 6: 'SD'}

    def _target(self):
        """Co hledáme: název (+ originální název), sezóna/epizoda nebo rok. Počítá se jednou."""
        if getattr(self, '_ranking_target', None):
            return self._ranking_target
        if self.manual_search:
            target = ranking.make_target('any', [self.search_query])
        else:
            from wcs.search.title_aliases import original_title
            if self.is_episode and self.season_number is not None and self.episode_number is not None:
                title = self.series_name or self.movie_title
                original = original_title('tv', title, '', self.tmdb_id)
                target = ranking.make_target('episode', [title, original],
                                             season=int(self.season_number), episode=int(self.episode_number))
            else:
                title = self.movie_title or self.search_query
                original = original_title('movie', title, self.movie_year, None if self.is_episode else self.tmdb_id)
                target = ranking.make_target('movie', [title, original], year=self.movie_year)
            self._original_title = original
        self._ranking_target = target
        return target

    def _preferred_quality(self):
        if self.preferred_quality:
            return {'remux': '4K', '4k': '4K'}.get(str(self.preferred_quality).lower(), self.preferred_quality)
        return self.PREFERRED_QUALITY_SETTING.get(self.addon.getSettingInt('autoplay_preferred_quality'))

    def _rank(self, files):
        return ranking.rank(files, self._target(), self._preferred_quality())

    def _search_queries(self):
        """Dotazy na Webshare: původní dotaz + český i originální název (u epizod i formát 1x02)."""
        queries = [self.search_query]
        target = self._target()
        original = getattr(self, '_original_title', '')
        if target['kind'] == 'episode':
            title = self.series_name or self.movie_title
            queries += ranking.episode_queries([title, original], target['season'], target['episode'])
        elif target['kind'] == 'movie':
            queries += ranking.movie_queries([self.movie_title, original], self.movie_year)
        return list(dict.fromkeys(q for q in queries if q))
    
    def _perform_search_kraska(self):
        """Provede vyhledávání přes Stream Cinema API (pro KRA.sk provider)."""
        try:
            from wcs.streamcinema import SCClient
            
            # 🔍 DEBUG: Kraska search start
            xbmc.log(f'🔍 [KraskaSearch] Starting search for: query="{self.search_query}", is_episode={self.is_episode}, series_name="{getattr(self, "series_name", "")}"', xbmc.LOGINFO)
            
            # Ověřit SC autentizaci
            is_auth = SCClient.is_authenticated(self.addon)
            xbmc.log(f'🔍 [KraskaSearch] SC authenticated: {is_auth}', xbmc.LOGINFO)
            
            if not is_auth:
                # Zkusit získat SC token přes KRA.sk session
                kraska_token = self.addon.getSetting('kraska_token')
                
                if kraska_token:
                    sc_token = SCClient.get_auth_token(self.addon, kraska_token)
                    if not sc_token:
                        xbmcgui.Dialog().notification(
                            "KRA.sk",
                            "Nepodařilo se připojit ke Stream Cinema",
                            xbmcgui.NOTIFICATION_ERROR
                        )
                        return []
                else:
                    xbmcgui.Dialog().notification(
                        "KRA.sk",
                        "Nejprve se přihlaste ke KRA.sk",
                        xbmcgui.NOTIFICATION_WARNING
                    )
                    return []
            
            # Zjednodušit search query pro SC API
            import re
            simplified_query = self.search_query
            
            # Odstranit rok (4 číslice na konci nebo v závorce)
            simplified_query = re.sub(r'\s*\(?\d{4}\)?\s*$', '', simplified_query)
            simplified_query = re.sub(r'\s+\d{4}\s*$', '', simplified_query)
            
            # Odstranit podtitul za dvojtečkou
            if ':' in simplified_query:
                simplified_query = simplified_query.split(':')[0].strip()
            
            simplified_query = simplified_query.strip()
            
            # Vyhledat přes SC
            if self.is_episode:
                # Pro seriály použít series_name (bez SxxExx) - SC API nerozumí epizodnímu formátu
                sc_query = self.series_name if self.series_name else simplified_query
                items = SCClient.search_series(sc_query, self.addon)
            else:
                items = SCClient.search_movies(simplified_query, self.addon)
            
            if not items:
                xbmc.log("🔍 [KraskaSearch] No results from SC API", level=xbmc.LOGINFO)
                return []
            
            xbmc.log(f'🔍 [KraskaSearch] SC API returned {len(items)} items', xbmc.LOGINFO)
            
            # Konvertovat SC formát na Webshare-like formát pro kompatibilitu s UI
            file_items = []
            for item in items:
                # SC vrací menu items s url pro další navigaci
                # Musíme získat streams pro každý film
                play_url = item.get('url')
                if not play_url:
                    continue
                
                streams = SCClient.get_streams(play_url, self.addon)
                xbmc.log(f'🔍 [KraskaSearch] Item "{item.get("title", "?")}": {len(streams)} streams', xbmc.LOGINFO)
                
                for stream in streams:
                    provider = stream.get('provider', '').lower()
                    
                    if provider != 'kraska':
                        continue  # Přeskočit non-KRA.sk streamy
                    
                    # Konvertovat stream na file item
                    # SC formát: title, quality, lang, size, url, filename, stream_info
                    quality = stream.get('quality', '')
                    lang = stream.get('lang', '')
                    ainfo = stream.get('ainfo', '')
                    vinfo = stream.get('vinfo', '')
                    
                    # Získat název z item (SC menu)
                    item_title = item.get('title', '')
                    
                    # Vytvoření čitelného názvu
                    if self.is_episode:
                        # Seriál: "Název seriálu - název epizody SxxExx.kvalita.jazyk.mkv"
                        season = getattr(self, 'season_number', None)
                        episode_num = getattr(self, 'episode_number', None)
                        series_name = getattr(self, 'series_name', '')
                        
                        season_str = f"S{season:02d}" if season else ""
                        episode_str = f"E{episode_num:02d}" if episode_num else ""
                        se_tag = f"{season_str}{episode_str}" if (season or episode_num) else ""
                        
                        if item_title and series_name:
                            base_name = f"{series_name} - {item_title}"
                        elif series_name:
                            base_name = series_name
                        else:
                            base_name = item_title or "Unknown"
                        
                        parts = [base_name]
                        if se_tag:
                            parts.append(se_tag)
                    else:
                        # Film: "Název filmu.kvalita.jazyk.mkv"
                        base_name = self.movie_title or item_title or "Unknown"
                        parts = [base_name]
                    
                    # Přidat kvalitu a jazyk
                    if quality:
                        parts.append(quality)
                    if lang:
                        parts.append(lang)
                    
                    synthetic_name = ".".join(parts) + ".mkv"
                    
                    # Parsovat size (např. "4.91 GB" -> bytes)
                    size_str = stream.get('size', '0')
                    try:
                        if 'GB' in size_str:
                            size_bytes = int(float(size_str.replace('GB', '').strip()) * 1024 * 1024 * 1024)
                        elif 'MB' in size_str:
                            size_bytes = int(float(size_str.replace('MB', '').strip()) * 1024 * 1024)
                        else:
                            size_bytes = int(size_str)
                    except:
                        size_bytes = 0
                    
                    # Získat bitrate pro odhad kvality pokud není v názvu
                    bitrate = stream.get('bitrate', 0)
                    
                    file_item = {
                        'name': synthetic_name,  # Čitelný název
                        'ident': stream.get('url'),  # provider path pro získání ident
                        'size': size_bytes,
                        'quality': quality,
                        'lang': lang,
                        'audio': ainfo,
                        'video': vinfo,
                        'provider': 'kraska',
                        'sc_stream': stream,  # Uložíme celý stream pro resolve
                        'positive_votes': 0,
                        'negative_votes': 0,
                        'bitrate': bitrate
                    }
                    file_items.append(file_item)
                    xbmc.log(f"[SearchDialog] KRA.sk stream: {synthetic_name}, quality={quality}, lang={lang}, size={size_bytes}", level=xbmc.LOGINFO)

            
            xbmc.log(f"[plugin.video.milionar] Found {len(file_items)} KRA.sk streams", level=xbmc.LOGINFO)
            
            return file_items  # řadí se až spojený seznam v _perform_search
            
        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] Error searching via SC/KRA.sk: {e}", level=xbmc.LOGERROR)
            import traceback
            traceback.print_exc()
            return []
    
    def _perform_search_webshare(self):
        """Webshare: všechny dotazy z _search_queries paralelně, výsledky sloučené podle ident."""
        try:
            token = webshare_api.revalidate(self.addon, lambda msg, title=None, icon=None, **kwargs: xbmcgui.Dialog().notification(title, msg, icon=icon))
            if not token:
                return []

            queries = self._search_queries()
            from concurrent.futures import ThreadPoolExecutor
            with ThreadPoolExecutor(max_workers=len(queries)) as pool:
                answers = list(pool.map(lambda q: self._webshare_query(q, token), queries))
            all_items = {}
            for items in answers:
                for item in items:
                    all_items.setdefault(item['ident'], item)
            xbmc.log(f"[plugin.video.milionar] Webshare: {len(all_items)} files for {queries}", level=xbmc.LOGINFO)

            # Nic správného -> záložní dotazy (zkrácený název u epizod, název bez roku u filmů)
            target = self._target()
            if not ranking.rank(list(all_items.values()), target):
                if self.is_episode:
                    fallback = do_webshare_search_with_retry(self.search_query, token, self.addon)
                    for ident, item in fallback.items():
                        all_items.setdefault(ident, item)
                elif self.movie_title and self.movie_year:
                    for item in self._webshare_query(self.movie_title, token):
                        all_items.setdefault(item['ident'], item)
                xbmc.log(f"[plugin.video.milionar] Webshare: {len(all_items)} files after fallback query", level=xbmc.LOGINFO)
            return list(all_items.values())

        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] Error searching Webshare: {e}", level=xbmc.LOGERROR)
            import traceback
            traceback.print_exc()
            return []

    def _webshare_query(self, query, token):
        """Jeden Webshare dotaz (bez GUI, volá se z vláken) -> seznam souborů."""
        try:
            response = webshare_api.api_call('search', {
                'what': query,
                'category': 'video',
                'sort': '',
                'limit': 50,
                'offset': 0,
                'wst': token
            })
            xml = ET.fromstring(response.content)
            if not webshare_api.is_ok(xml):
                xbmc.log(f"[plugin.video.milionar] Webshare search '{query}' returned error", level=xbmc.LOGERROR)
                return []
            items = []
            for file in xml.iter('file'):
                item = {e.tag: e.text for e in file}
                if item.get('ident'):
                    item['name'] = item.get('name') or ''
                    items.append(item)
            return items
        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] Webshare search '{query}' failed: {e}", level=xbmc.LOGERROR)
            return []

    def _populate_action_buttons(self):
        """Naplní list akčních tlačítek (pill-shaped) pod metadaty."""
        try:
            action_list = self.getControl(103)
            action_list.reset()

            actions = [
                ('play_best', 'Přehrát'),
                ('download', 'Stáhnout'),
                ('play_game', 'Hrát hru'),
            ]

            for action_id, label in actions:
                item = xbmcgui.ListItem(label=label)
                item.setProperty('action_id', action_id)
                action_list.addItem(item)

        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] Error populating action buttons: {e}", level=xbmc.LOGERROR)

    def _play_selected_item(self):
        """Přehraje vybraný soubor ze seznamu výsledků."""
        results_list = self.getControl(50)
        selected_item = results_list.getSelectedItem()
        if not selected_item:
            xbmcgui.Dialog().notification("Chyba", "Nejprve vyberte soubor k přehrání", xbmcgui.NOTIFICATION_WARNING)
            return

        ident = selected_item.getProperty('ident')
        name = selected_item.getProperty('filename')
        provider = selected_item.getProperty('provider') or 'webshare'
        self.selected_result = {'ident': ident, 'name': name, 'provider': provider}

        self._handle_autoplay_and_close()

    def _play_best_item(self):
        """Přehraje první (nejlepší) soubor ze seznamu výsledků."""
        results_list = self.getControl(50)
        if results_list.size() == 0:
            xbmcgui.Dialog().notification("Chyba", "Nebyly nalezeny žádné soubory", xbmcgui.NOTIFICATION_WARNING)
            return

        results_list.selectItem(0)
        first_item = results_list.getSelectedItem()
        if not first_item:
            xbmcgui.Dialog().notification("Chyba", "Nejprve vyberte soubor k přehrání", xbmcgui.NOTIFICATION_WARNING)
            return

        ident = first_item.getProperty('ident')
        name = first_item.getProperty('filename')
        provider = first_item.getProperty('provider') or 'webshare'
        self.selected_result = {'ident': ident, 'name': name, 'provider': provider}

        self._handle_autoplay_and_close()

    def _handle_autoplay_and_close(self):
        """Zpracuje autoplay nastavení a zavře dialog."""
        if self.is_episode:
            if self.autoplay_enabled:
                self.autoplay_manager.set_autoplay_enabled(True)
                self.autoplay_manager.set_current_episode(
                    self.series_name,
                    self.season_number,
                    self.episode_number,
                    self.tmdb_id
                )
                xbmc.log(f"[plugin.video.milionar] Autoplay enabled for {self.series_name} S{self.season_number}E{self.episode_number}", level=xbmc.LOGINFO)
            else:
                self.autoplay_manager.set_autoplay_enabled(False)

        self.close()

    def _populate_results_list(self):
        """Naplní seznam výsledků s extrahovanými metadaty."""
        try:
            results_list = self.getControl(50)
            results_list.reset()
            
            # Pořadí i vzorky odfiltrované už v _rank; preferovaná kvalita je v řazení
            preferred = self._preferred_quality()

            # Barevné mapování pro quality pill ikonky
            quality_color_map = {
                '4K': 'FFD4AF37',      # Zlatá
                'REMUX': 'FFD4AF37',   # Zlatá (jako 4K)
                '1080p': 'FF4488FF',   # Modrá
                '720p': 'FF44BB44',    # Zelená
                '480p': 'FFFF9944',    # Oranžová
                '360p': 'FFAA8844',    # Hnědá
                'SD': 'FF888888'       # Šedá
            }
            
            for item in self.search_results:
                filename = item.get('name', '')
                
                # Metadata ze stejného parseru, podle kterého se řadí (chipy = pořadí)
                info = item.get('info') or ranking.parse(filename, item.get('size'))
                clean_title = extract_clean_title(filename)
                quality = info['quality']

                quality_colored = format_quality_with_color(quality)  # Barevná kvalita (legacy)

                # Zvýraznit preferovanou kvalitu
                if preferred and quality == preferred:
                    quality_colored = f"⭐ {quality_colored}"

                language = ranking.lang_chip(info)
                file_format = info['format']
                size_formatted = format_size(item.get('size'))
                user_rating = calculate_rating(item)
                
                # Vytvoření ListItem - dynamický provider label
                provider = item.get('provider', 'webshare')
                if provider == 'kraska':
                    provider_name = "kra.sk"
                    provider_color = "FFFF69B4"  # Růžová
                else:
                    provider_name = "webshare.cz"
                    provider_color = "FF00B4D8"  # Tyrkysová
                
                list_item = xbmcgui.ListItem(label=filename)
                
                # Provider properties
                list_item.setProperty('provider_name', provider_name)
                list_item.setProperty('provider_color', provider_color)
                provider_letter = 'K' if provider == 'kraska' else 'W'
                list_item.setProperty('provider_letter', provider_letter)
                list_item.setProperty('provider_letter_colored', f"[COLOR {provider_color}]{provider_letter}[/COLOR]")
                list_item.setProperty('clean_title', clean_title)
                
                # Nastavení vlastností pro dvojřádkový design
                list_item.setProperty('quality', quality_colored)
                list_item.setProperty('quality_raw', quality or 'N/A')
                list_item.setProperty('quality_color', quality_color_map.get(quality, 'FF888888'))
                list_item.setProperty('language', language)
                list_item.setProperty('format', file_format)
                list_item.setProperty('format_upper', file_format.upper() if file_format else '')
                list_item.setProperty('size_formatted', size_formatted)
                list_item.setProperty('chips_image', chip_strip(
                    [quality, file_format.upper() if file_format else '', size_formatted, language]))
                list_item.setProperty('user_rating', user_rating)
                
                # Quality pill width flag (wide for 1080p/720p/480p, narrow for 4K/SD/N/A)
                is_wide = quality in ('1080p', '720p', '480p')
                list_item.setProperty('quality_wide', '1' if is_wide else '0')
                
                # Sloučený metadata řádek: jazyk · formát · velikost · rating
                meta_parts = []
                if language:
                    meta_parts.append(f"[COLOR FF66DD66]{language}[/COLOR]")
                if file_format:
                    meta_parts.append(f"[COLOR FFAAAAFF]{file_format.upper()}[/COLOR]")
                if size_formatted:
                    meta_parts.append(size_formatted)
                if user_rating:
                    meta_parts.append(f"[COLOR FFFECC33]{user_rating}[/COLOR]")
                list_item.setProperty('metadata_line', '  ·  '.join(meta_parts))
                
                # Původní Webshare metadata
                list_item.setProperty('ident', item.get('ident', ''))
                list_item.setProperty('filename', filename)
                list_item.setProperty('positive_votes', str(item.get('positive_votes', '0')))
                list_item.setProperty('negative_votes', str(item.get('negative_votes', '0')))
                list_item.setProperty('provider', provider)
                
                # Přidání do seznamu
                results_list.addItem(list_item)
                
        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] Error populating search results: {e}", level=xbmc.LOGERROR)
            import traceback
            traceback.print_exc()

    def _update_autoplay_label(self):
        """Aktualizuje label autoplay buttonu podle aktuálního stavu."""
        if self.is_episode:
            # Logika pro epizody
            if self.from_library:
                # Text pro epizody z knihovny
                if self.autoplay_enabled:
                    label = "Automatické přehrávání další epizody: [COLOR FF4CAF50]ZAPNUTO[/COLOR]"
                else:
                    label = "Automatické přehrávání další epizody: [COLOR FFF44336]VYPNUTO[/COLOR]"
            else:
                # Text pro epizody z menu doplnku
                label = "Automatické přehrávání dalších epizod seriálu je dostupné pouze z knihovny Kodi"
        else:
            # Text pro filmy
            label = "Automatické přehrávání další epizody seriálu je dostupné pouze pro seriály z knihovny Kodi"
        
        self.setProperty('WCS.Autoplay.Label', label)
        xbmc.log(f"[plugin.video.milionar] Autoplay label updated: {label}", level=xbmc.LOGDEBUG)

    def onClick(self, controlId):
        """Obsluha kliknutí na kontrolky."""
        self._cancel_countdown()
        if controlId == 50:  # Seznam výsledků: akce podle režimu v hlavičce
            if self.mode == 'download':
                self._download_selected_row()
            else:
                self._play_selected_item()
        elif controlId in (201, 202):  # Přepínač režimu v hlavičce
            self._set_mode('play' if controlId == 201 else 'download')
        elif controlId in (110, 111, 112):  # Nový design - tlačítka v XML
            if controlId == 110:
                self._toggle_plot()
            elif controlId == 111:
                self.start_game()
            elif controlId == 112:
                self.close()
        elif controlId == 103:  # Akční tlačítka (pill-shaped list)
            action_list = self.getControl(103)
            selected = action_list.getSelectedItem()
            if selected:
                action_id = selected.getProperty('action_id')
                if action_id == 'play_best':
                    self._play_best_item()
                elif action_id == 'download':
                    self._open_download_picker()
                elif action_id == 'play_game':
                    self.start_game()
        elif controlId == 71:  # Autoplay button
            try:
                # Autoplay je dostupné pouze z knihovny
                if not self.from_library:
                    xbmcgui.Dialog().notification("Info", "Automatické přehrávání je dostupné pouze z knihovny Kodi", xbmcgui.NOTIFICATION_INFO)
                    return
                    
                # Toggle stavu pouze pro knihovnu
                self.autoplay_enabled = not self.autoplay_enabled
                self._update_autoplay_label()
                
                xbmc.log(f"[plugin.video.milionar] Autoplay button toggled: {self.autoplay_enabled}", level=xbmc.LOGINFO)
                
            except Exception as e:
                xbmc.log(f"[plugin.video.milionar] Error handling autoplay button toggle: {e}", level=xbmc.LOGERROR)

    def onAction(self, action):
        """Obsluha akcí (např. tlačítko Zpět)."""
        if action.getId() != 107:  # ACTION_MOUSE_MOVE odpočet neruší
            self._cancel_countdown()
        if action.getId() in (xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK):
            self.close()
        elif action.getId() == xbmcgui.ACTION_CONTEXT_MENU:
            self._open_actions_menu()

    def _set_mode(self, mode):
        """Přepne režim pravého panelu; další krok je výběr souboru, proto fokus na seznam."""
        self.mode = mode
        self.setProperty('WCS.Search.Mode', mode)
        xbmc.log(f"[plugin.video.milionar] SearchDialog: mode -> {mode}", level=xbmc.LOGINFO)
        self.setFocusId(50)

    def _download_selected_row(self):
        """Stáhne vybraný řádek; KRA.sk streamy stahovat neumíme (DownloadManager je jen pro Webshare)."""
        selected_item = self.getControl(50).getSelectedItem()
        if selected_item and selected_item.getProperty('provider') == 'kraska':
            ui.popinfo(self.addon.getLocalizedString(32145), self.addon.getAddonInfo('name'),
                       icon=xbmcgui.NOTIFICATION_INFO)
            return
        self.download_selected_file()

    def _open_actions_menu(self):
        """The same manager as every listing; source actions apply to the selected file."""
        from wcs.skin import context
        selected = self.getControl(50).getSelectedItem()
        actions = {}
        if selected:
            actions['play'] = (context.text(32377), self._play_selected_item)
            actions['best'] = (context.text(32724), self._play_best_item)
            if (selected.getProperty('provider') or 'webshare') == 'webshare':
                actions['download'] = (context.text(30212), self._download_selected_row)
                ident = selected.getProperty('ident')
                if ident:
                    actions['file_info'] = (context.text(30211), lambda: ui.display_file_info(ident, self.addon))
        if any(result.get('provider', 'webshare') == 'webshare' for result in self.search_results):
            actions['download_pick'] = (context.text(32725), self._open_download_picker)
        if self.is_episode and self.from_library:
            label = context.text(32733 if self.autoplay_enabled else 32734)
            actions['autoplay'] = (label, self._toggle_context_autoplay)
        context.open_menu({'type': 'file'}, actions=actions)

    def _toggle_context_autoplay(self):
        self.autoplay_enabled = not self.autoplay_enabled
        self._update_autoplay_label()

    def _open_download_picker(self):
        """Otevře dialog pro výběr souboru ke stažení."""
        xbmc.log("[plugin.video.milionar] _open_download_picker: Opening download picker dialog", level=xbmc.LOGINFO)
        
        try:
            # Importujeme download dialog
            from wcs.ui.dialogs.DialogWcsDownload import show_download_dialog
            
            # Předáme všechna metadata a výsledky
            kwargs = {
                'search_results': [item for item in self.search_results if item.get('provider', 'webshare') == 'webshare'],
                'movie_title': self.movie_title,
                'movie_year': self.movie_year,
                'poster_url': self.poster_url,
                'rating': self.rating,
                'genre': self.genre,
                'director': self.director,
                'runtime': self.runtime,
                'plot': self.plot,
                'fanart_url': self.fanart_url,
                'is_episode': self.is_episode,
                'series_name': self.series_name,
                'season_number': self.season_number,
                'episode_number': self.episode_number,
                'episode_title': self.episode_title,
            }
            
            # Zobrazíme download picker dialog
            selected_result = show_download_dialog(**kwargs)
            
            if selected_result:
                xbmc.log(f"[plugin.video.milionar] _open_download_picker: File selected: {selected_result.get('name')}", level=xbmc.LOGINFO)
            else:
                xbmc.log("[plugin.video.milionar] _open_download_picker: No file selected", level=xbmc.LOGINFO)
                
        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] _open_download_picker: Exception occurred: {e}", level=xbmc.LOGERROR)
            ui.popinfo(f"{self.addon.getLocalizedString(32133)}: {e}", "Chyba", icon=xbmcgui.NOTIFICATION_ERROR)

    def download_selected_file(self):
        """Stáhne vybraný soubor z výsledků vyhledávání."""
        xbmc.log("[plugin.video.milionar] download_selected_file: Starting download process", level=xbmc.LOGINFO)
        
        try:
            xbmc.log("[plugin.video.milionar] download_selected_file: Getting control 50 (results list)", level=xbmc.LOGINFO)
            # Získat vybranou položku ze seznamu
            results_list = self.getControl(50)
            xbmc.log(f"[plugin.video.milionar] download_selected_file: Control 50 result: {results_list}", level=xbmc.LOGINFO)
            
            xbmc.log("[plugin.video.milionar] download_selected_file: Getting selected item", level=xbmc.LOGINFO)
            selected_item = results_list.getSelectedItem()
            xbmc.log(f"[plugin.video.milionar] download_selected_file: Selected item: {selected_item}", level=xbmc.LOGINFO)
            
            if not selected_item:
                xbmc.log("[plugin.video.milionar] download_selected_file: No selected item, showing warning", level=xbmc.LOGINFO)
                ui.popinfo("Nejprve vyberte soubor ke stažení", "Chyba", icon=xbmcgui.NOTIFICATION_WARNING)
                return
            
            xbmc.log("[plugin.video.milionar] download_selected_file: Getting ident property", level=xbmc.LOGINFO)
            # Získat Webshare ident a název souboru
            ident = selected_item.getProperty('ident')
            xbmc.log(f"[plugin.video.milionar] download_selected_file: Ident: {ident}", level=xbmc.LOGINFO)
            
            xbmc.log("[plugin.video.milionar] download_selected_file: Getting filename property", level=xbmc.LOGINFO)
            filename = selected_item.getProperty('filename')
            xbmc.log(f"[plugin.video.milionar] download_selected_file: Filename: {filename}", level=xbmc.LOGINFO)
            
            if not ident:
                xbmc.log("[plugin.video.milionar] download_selected_file: No ident, showing error", level=xbmc.LOGINFO)
                ui.popinfo("Chybí identifikátor souboru", "Chyba", icon=xbmcgui.NOTIFICATION_ERROR)
                return
            
            # IHNED zavřít VŠECHNY dialogy po získání všech potřebných dat
            xbmc.log("[plugin.video.milionar] download_selected_file: Closing ALL dialogs immediately", level=xbmc.LOGINFO)
            
            # Zavřít všechny otevřené dialogy
            xbmc.executebuiltin("Dialog.Close(all)")
            
            # Také zavřít aktuální dialog pro jistotu
            self.close()
            
            # Spustit stahování až po zavření dialogu
            xbmc.log("[plugin.video.milionar] download_selected_file: About to import DownloadManager", level=xbmc.LOGINFO)
            from wcs.webshare import DownloadManager as download
            xbmc.log("[plugin.video.milionar] download_selected_file: DownloadManager imported successfully", level=xbmc.LOGINFO)
            
            xbmc.log(f"[plugin.video.milionar] download_selected_file: Calling download.download_file with ident: {ident}", level=xbmc.LOGINFO)
            download.download_file(ident, self.addon)
            xbmc.log("[plugin.video.milionar] download_selected_file: Download started successfully", level=xbmc.LOGINFO)
            
        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] download_selected_file: Exception occurred: {e}", level=xbmc.LOGERROR)
            xbmc.log(f"[plugin.video.milionar] download_selected_file: Exception type: {type(e)}", level=xbmc.LOGERROR)
            import traceback
            xbmc.log(f"[plugin.video.milionar] download_selected_file: Full traceback: {traceback.format_exc()}", level=xbmc.LOGERROR)
            
            xbmc.log("[plugin.video.milionar] download_selected_file: About to call ui.popinfo for error", level=xbmc.LOGINFO)
            ui.popinfo(f"Chyba při stahování: {e}", "Chyba", icon=xbmcgui.NOTIFICATION_ERROR)
            xbmc.log("[plugin.video.milionar] download_selected_file: Error notification shown", level=xbmc.LOGINFO)
    
    def start_game(self):
        """Spustí herní dialog pro film nebo epizodu seriálu."""
        try:
            # Získat metadata z properties nebo z konstruktoru
            title = self.getProperty('WCS.Search.Title')
            year = self.getProperty('WCS.Search.Year')
            plot = getattr(self, 'plot', '') or self.getProperty('WCS.Search.Plot')
            poster = self.getProperty('WCS.Search.Poster')
            rating = self.getProperty('WCS.Search.Rating')
            genre = self.getProperty('WCS.Search.Genre')
            director = self.getProperty('WCS.Search.Director')
            runtime = self.getProperty('WCS.Search.Runtime')
            
            # Pokud nemáme metadata z properties, použít z konstruktoru
            if not plot and hasattr(self, 'plot'):
                plot = self.plot
            if not poster and hasattr(self, 'poster_url'):
                poster = self.poster_url
            if not rating and hasattr(self, 'rating'):
                rating = self.rating
            if not genre and hasattr(self, 'genre'):
                genre = self.genre
            if not director and hasattr(self, 'director'):
                director = self.director
            if not runtime and hasattr(self, 'runtime'):
                runtime = self.runtime
            
            # Určit typ média podle dostupných dat
            media_type = "movie"  # default
            episode_title = ""
            season_number = None
            episode_number = None
            
            # Použít is_episode flag z konstruktoru pro rozlišení film vs. seriál
            if self.is_episode:
                media_type = "series"
                # Pokud máme episode_title z konstruktoru, použít ho
                if hasattr(self, 'episode_title') and self.episode_title:
                    episode_title = self.episode_title
                # Pokud máme season_number a episode_number z konstruktoru, použít je
                if hasattr(self, 'season_number') and self.season_number:
                    season_number = self.season_number
                if hasattr(self, 'episode_number') and self.episode_number:
                    episode_number = self.episode_number
                # Pokud máme series_name z konstruktoru, použít ho jako title
                if hasattr(self, 'series_name') and self.series_name:
                    title = self.series_name
            else:
                # Pro filmy zajistit, že máme správný title
                if hasattr(self, 'movie_title') and self.movie_title:
                    title = self.movie_title
                # Pro filmy také použít plot z konstruktoru pokud není v properties
                if not plot and hasattr(self, 'plot'):
                    plot = self.plot
            
            # Vytvořit fanart URL z posteru
            fanart = poster if poster else ""
            banner_fanart = fanart  # Stejně jako v router.py
            
            from wcs.games import millionaire
            millionaire.open_game(millionaire.Subject(
                title=title, media_type=media_type, plot=plot, genre=genre, poster=fanart, backdrop=banner_fanart,
                year=self.movie_year or '', tmdb_id=str(self.tmdb_id or ''),
                episode_title=episode_title, season_number=season_number, episode_number=episode_number))
            
        except Exception as e:
            xbmc.log(f"[plugin.video.milionar] Error starting game: {e}", level=xbmc.LOGERROR)
            xbmcgui.Dialog().notification("Chyba", f"Chyba při spouštění hry: {e}", xbmcgui.NOTIFICATION_ERROR)

# Funkce pro zobrazení dialogu vyhledávání
def show_search_dialog(search_query, movie_title='', movie_year='', poster_url='', rating='', genre='', director='', runtime='', plot='', search_results=[], is_episode=False, series_name='', season_number=None, episode_number=None, tmdb_id=None, preferred_quality=None, autoplay_request=False, fanart_url='', episode_title='', episode_thumb='', schedule_episode_info=False, from_library=False, manual_search=False):
    """
    Zobrazí dialogové okno s výsledky vyhledávání.
    
    Args:
        search_query (str): Dotaz pro vyhledávání na Webshare
        movie_title (str, optional): Název filmu pro zobrazení v hlavičce
        movie_year (str, optional): Rok filmu
        poster_url (str, optional): URL obrázku filmu pro zobrazení v dialogu
        rating (str, optional): Hodnocení filmu
        genre (str, optional): Žánr filmu
        director (str, optional): Režisér
        runtime (str, optional): Délka filmu
        plot (str, optional): Popis filmu
        search_results (list, optional): Seznam výsledků vyhledávání
        is_episode (bool, optional): Zda se jedná o epizodu seriálu
        series_name (str, optional): Název seriálu
        season_number (int, optional): Číslo sezóny
        episode_number (int, optional): Číslo epizody
        tmdb_id (int, optional): TMDb ID seriálu
        preferred_quality (str, optional): Preferovaná kvalita pro autoplay
        
    Returns:
        dict or None: Vybraný výsledek nebo None pokud uživatel nic nevybral
    """
    addon = xbmcaddon.Addon()
    
    # Dialogové okno zobrazíme pouze pokud je search_query neprázdný
    if not search_query:
        xbmcgui.Dialog().notification("Chyba", "Prázdný vyhledávací dotaz", xbmcgui.NOTIFICATION_ERROR)
        return None
        
    # OPRAVA: Pro autoplay requests nebo autoplay_first_item automaticky vybrat první soubor bez dialogu
    autoplay_first_item = addon.getSettingBool('autoplay_first_item')

    # Ruční spuštění s automatickým přehráváním: dialog se ukáže a první řádek se přehraje po odpočtu.
    # 0 s = přehrát hned bez dialogu; další epizoda a kanály (autoplay_request) jsou vždy bez dialogu.
    autoplay_countdown = 0
    if autoplay_first_item and not autoplay_request:
        try:
            autoplay_countdown = max(0, int(addon.getSetting('autoplay_first_item_delay') or 5))
        except ValueError:
            autoplay_countdown = 5

    if autoplay_request or (autoplay_first_item and not autoplay_countdown):
        # Pro autoplay requests zkontrolovat globální nastavení
        if autoplay_request:
            autoplay_enabled_global = addon.getSettingBool('autoplay_enabled_global')
            if not autoplay_enabled_global:
                # Autoplay je zakázán globálně - nepustit další epizodu
                xbmc.log(f"[plugin.video.milionar] Autoplay request: Autoplay disabled globally, not playing next episode", level=xbmc.LOGINFO)
                return None
        
        # Použijeme stejnou logiku jako dialog - načteme výsledky a vybereme první
        # Vytvoříme dočasný dialog pro načtení výsledků (bez zobrazení)
        temp_dialog = SearchDialog(
            "search/DialogWcsSearch.xml", 
            addon.getAddonInfo('path'),
            search_query=search_query,
            movie_title=movie_title,
            movie_year=movie_year,
            poster_url=poster_url,
            rating=rating,
            genre=genre,
            director=director,
            runtime=runtime,
            plot=plot,
            search_results=search_results,
            is_episode=is_episode,
            series_name=series_name,
            season_number=season_number,
            episode_number=episode_number,
            tmdb_id=tmdb_id,
            preferred_quality=preferred_quality,
            fanart_url=fanart_url,
            episode_title=episode_title,
            episode_thumb=episode_thumb,
            from_library=from_library,
            manual_search=manual_search,
        )
        
        # Načteme výsledky bez zobrazení dialogu; vybere se první řádek, který by ukázal dialog
        results = temp_dialog._perform_search()
        del temp_dialog
        selected_file = ranking.pick(results)
        label = 'Autoplay' if autoplay_request else 'Autoplay first item'
        if selected_file:
            xbmc.log(f"[plugin.video.milionar] {label} request: Selected file: {selected_file.get('name')}", level=xbmc.LOGINFO)
            return {'ident': selected_file.get('ident'), 'name': selected_file.get('name'),
                    'provider': selected_file.get('provider', 'webshare')}
        if autoplay_request or not results:
            # Radši nic než jiný díl/film
            xbmc.log(f"[plugin.video.milionar] {label} request: no matching file among {len(results)}", level=xbmc.LOGINFO)
            return None
        # autoplay_first_item bez jisté shody: ukážeme dialog s již nalezenými výsledky
        xbmc.log(f"[plugin.video.milionar] {label}: no confident match, showing dialog", level=xbmc.LOGINFO)
        search_results = results

    # Vytvoření instance dialogu s potřebnými parametry
    dialog = SearchDialog(
        "search/DialogWcsSearch.xml", 
        addon.getAddonInfo('path'),
        search_query=search_query,
        movie_title=movie_title,
        movie_year=movie_year,
        poster_url=poster_url,
        rating=rating,
        genre=genre,
        director=director,
        runtime=runtime,
        plot=plot,
        search_results=search_results,
        is_episode=is_episode,
        series_name=series_name,
        season_number=season_number,
        episode_number=episode_number,
        tmdb_id=tmdb_id,
        preferred_quality=preferred_quality,
        fanart_url=fanart_url,
        episode_title=episode_title,
        episode_thumb=episode_thumb,
        from_library=from_library,
        manual_search=manual_search,
        autoplay_countdown=autoplay_countdown,
    )
    
    # Zobrazení dialogu
    dialog.doModal()
    
    # Získání výsledku a zpracování přehrávání
    result = dialog.selected_result

    # Uvolnění paměti
    del dialog

    return result 
