from datetime import timedelta

from lib.clients.stremio.addon_client import StremioAddonCatalogsClient
from lib.db.cached import cache
from lib.utils.kodi.settings import get_cache_expiration, is_cache_enabled
from lib.utils.kodi.utils import kodilog


def catalogs_get_cache(path, params, *args, **kwargs):
    identifier = f"{path}{params}{args}"
    data = cache.get(identifier)
    if data:
        return data

    handlers = {
        "search_catalog": lambda query: StremioAddonCatalogsClient(params).search_catalog(query),
        "list_catalog": lambda **kwargs: StremioAddonCatalogsClient(params).get_catalog_info(
            **kwargs
        ),
        "list_stremio_seasons": lambda: StremioAddonCatalogsClient(params).get_meta_info(),
        "list_stremio_episodes": lambda: StremioAddonCatalogsClient(params).get_meta_info(),
        "list_stremio_tv": lambda: StremioAddonCatalogsClient(params).get_stream_info(),
        "list_stremio_movie": lambda: StremioAddonCatalogsClient(params).get_stream_info(),
    }

    try:
        handler = handlers.get(path, lambda: None)
        if args or kwargs:
            data = handler(*args, **kwargs)
        else:
            data = handler()
    except Exception as e:
        kodilog(f"Error: {e}")
        return {}

    if data is not None:
        cache.set(
            identifier,
            data,
            timedelta(hours=get_cache_expiration() if is_cache_enabled() else 0),
        )

    return data
