# -*- coding: utf-8 -*-
"""
Konfigurace MenuCache a nástroje pro ladění
"""

from resources.lib.utils.log_utils import get_logger

log = get_logger()

# Nastavení mezipaměti (zde lze upravit)
CACHE_CONFIG = {
    # Trakt Static Menus / Hubs
    'trakt_main_menu': {
        'enabled': True,
        'ttl': 1800,  # 30 minut
        'description': 'Hlavní menu Trakt'
    },
    'trakt_lists_hub_menu': {
        'enabled': True,
        'ttl': 1800,  # 30 minut
        'description': 'Trakt veřejné seznamy hub'
    },
    'trakt_movies_hub_menu': {
        'enabled': True,
        'ttl': 1800,  # 30 minut
        'description': 'Trakt filmy hub'
    },
    'trakt_shows_hub_menu': {
        'enabled': True,
        'ttl': 1800,  # 30 minut
        'description': 'Trakt seriály hub'
    },

    # TMDB Main Menus
    'tmdb_main_menu_v2': {
        'enabled': True,
        'ttl': 1800,  # 30 minut
        'description': 'Hlavní menu TMDB (v2 – VOD služby ČR)'
    },
    'tmdb_movie_categories': {
        'enabled': True,
        'ttl': 1800,  # 30 minut
        'description': 'Kategorie filmů TMDB'
    },
    'tmdb_tv_categories': {
        'enabled': True,
        'ttl': 1800,  # 30 minut
        'description': 'Kategorie seriálů TMDB'
    },
    'tmdb_person_categories': {
        'enabled': True,
        'ttl': 1800,  # 30 minut
        'description': 'Kategorie osob TMDB'
    },
    'tmdb_list_pages': {
        'enabled': True,
        'ttl': 900,  # 15 minut
        'description': 'Stránky seznamů TMDB (trendy/filmy/seriály/osoby)'
    },

    # Trakt Progress Menu
    'trakt_shows_progress': {
        'enabled': True,
        'ttl': 600,  # 10 minut
        'description': 'Seznam sledovaného progresu seriálů'
    },
    # TMDB Episodes
    'tmdb_episodes': {
        'enabled': True,
        'ttl': 900,  # 15 minut
        'description': 'Epizody TV seriálů podle sezóny'
    },
    'tmdb_seasons': {
        'enabled': True,
        'ttl': 1200,  # 20 minut
        'description': 'Sezóny TV seriálu (TMDB)'
    },
    # Series Seasons
    'series_season': {
        'enabled': True,
        'ttl': 1200,  # 20 minut
        'description': 'Epizody správce seriálů'
    },
    'series_seasons': {
        'enabled': True,
        'ttl': 1200,  # 20 minut
        'description': 'Sezóny správce seriálů'
    },
    'series_main_menu': {
        'enabled': True,
        'ttl': 900,  # 15 minut
        'description': 'Hlavní menu správce seriálů'
    },
    'series_filtered_menu': {
        'enabled': True,
        'ttl': 900,  # 15 minut
        'description': 'Filtrované submenu správce seriálů'
    },

    # Trakt Dynamic Menus (klíče mohou být použity jako prefix pro dynamické cache klíče)
    'trakt_my_hub_menu': {
        'enabled': True,
        'ttl': 300,  # 5 minut — kompromis se svěžestí statistik
        'description': 'Trakt Můj Hub (Watchlist, Pokrok, Historie, Statistiky)'
    },
    'trakt_public_lists': {
        'enabled': True,
        'ttl': 1200,  # 20 minut
        'description': 'Trakt veřejné seznamy (popular/trending) — stránkováno'
    },
    'trakt_movies_list': {
        'enabled': True,
        'ttl': 900,  # 15 minut
        'description': 'Trakt filmy podle módu (trending/popular/anticipated) — stránkováno'
    },
    'trakt_shows_list': {
        'enabled': True,
        'ttl': 900,  # 15 minut
        'description': 'Trakt seriály podle módu (trending/popular/anticipated) — stránkováno'
    },
    'trakt_list_items': {
        'enabled': True,
        'ttl': 1200,  # 20 minut
        'description': 'Trakt položky uživatelského seznamu — stránkováno'
    },
    'trakt_watched_movies': {
        'enabled': True,
        'ttl': 600,  # 10 minut — invalidovat po playback
        'description': 'Trakt historie zhlédnutých filmů — stránkováno'
    },
    'trakt_watched_shows': {
        'enabled': True,
        'ttl': 600,  # 10 minut
        'description': 'Trakt historie zhlédnutých seriálů — stránkováno'
    },

    # Series Navigation Hub
    'series_nav_hub': {
        'enabled': True,
        'ttl': 60,  # 60 sekund — krátké TTL kvůli dynamickému počtu stahování
        'description': 'Navigátor Seriály (Hledat, Rozkoukané, Dosled., Epizody, Offline)'
    },
}

# Statická rozcestí (jen odkazy) — bezpečné pro Kodi endOfDirectory(cacheToDisc=True).
# Sladěno s CACHE_CONFIG TTL; při vypnuté položce v CACHE_CONFIG zůstane cacheToDisc=False.
KODI_DISC_CACHE_MENU_KEYS = frozenset({
    'trakt_main_menu',
    'trakt_movies_hub_menu',
    'trakt_shows_hub_menu',
    'trakt_lists_hub_menu',
    'tmdb_main_menu_v2',
    'tmdb_movie_categories',
    'tmdb_tv_categories',
    'tmdb_person_categories',
})


def kodi_cache_to_disc_for_menu(cache_key: str) -> bool:
    """
    Vrátí True pro xbmcplugin.endOfDirectory(..., cacheToDisc=True) u čistě statických hubů.
    Viz ARCHITECTURE — priorita 4 (disková cache Kodi).
    """
    if cache_key not in KODI_DISC_CACHE_MENU_KEYS:
        return False
    return is_cache_enabled(cache_key)

# Příznaky pro ladění
DEBUG = {
    'log_hits_misses': True,  # Protokolovat události trefy/minutí (HIT/MISS) mezipaměti
    'benchmark_timings': True,  # Protokolovat časy vykreslování (náročné)
    'serialize_validation': False,  # Validovat serializovaná data (náročné)
}


def is_cache_enabled(cache_key: str) -> bool:
    """
    Zkontroluje, zda je mezipaměť pro tento typ menu povolena.
    
    Args:
        cache_key: Jeden z klíčů v CACHE_CONFIG
    
    Returns:
        True, pokud je povoleno
    """
    if cache_key in CACHE_CONFIG:
        return CACHE_CONFIG[cache_key].get('enabled', False)
    # Podpora dynamických klíčů (např. 'trakt_movies_list_trending_1_20')
    return any(
        cache_key.startswith(k + '_') and CACHE_CONFIG[k].get('enabled', False)
        for k in CACHE_CONFIG
    )


def get_cache_ttl(cache_key: str) -> int:
    """
    Získá TTL (životnost) pro typ mezipaměti.
    
    Args:
        cache_key: Jeden z klíčů v CACHE_CONFIG
    
    Returns:
        TTL v sekundách
    """
    if cache_key in CACHE_CONFIG:
        return CACHE_CONFIG[cache_key].get('ttl', 300)
    # Podpora dynamických klíčů — hledáme nejdelší shodný prefix
    for k in sorted(CACHE_CONFIG, key=len, reverse=True):
        if cache_key.startswith(k + '_'):
            return CACHE_CONFIG[k].get('ttl', 300)
    return 300


def log_cache_event(event_type: str, cache_key: str, details: str = '') -> None:
    """
    Protokoluje události mezipaměti (HIT/MISS/INVALIDATE).
    
    Args:
        event_type: 'HIT', 'MISS', 'INVALIDATE' atd.
        cache_key: Identifikátor mezipaměti
        details: Další informace
    """
    if DEBUG['log_hits_misses']:
        msg = f"[MenuCache] {event_type}: {cache_key}"
        if details:
            msg += f" ({details})"
        log.info(msg)


def log_timing(operation: str, duration_ms: float, items_count: int = 0) -> None:
    """
    Protokoluje časování výkonu.
    
    Args:
        operation: Název operace
        duration_ms: Trvání v milisekundách
        items_count: Počet zpracovaných položek
    """
    if DEBUG['benchmark_timings']:
        msg = f"[MenuCache] {operation}: {duration_ms:.1f}ms"
        if items_count:
            msg += f" ({items_count} items, {duration_ms/items_count:.2f}ms/item)"
        log.info(msg)
