from datetime import datetime

from lib.api.tmdbv3api.as_obj import AsObj
from lib.api.trakt.trakt_utils import (
    add_trakt_collection_context_menu,
    add_trakt_custom_list_context_menu,
    add_trakt_favorites_context_menu,
    add_trakt_watched_context_menu,
    add_trakt_watchlist_context_menu,
    is_trakt_auth,
)
from lib.clients.tmdb.utils.utils import (
    add_kodi_dir_item,
    add_tmdb_movie_context_menu,
    add_tmdb_show_context_menu,
    tmdb_get,
)
from lib.utils.general.utils import set_pluging_category
from lib.utils.kodi.utils import (
    add_directory_items_batch,
    apply_section_view,
    build_url,
    end_of_directory,
    make_list_item,
    notification,
    translation,
)


class BaseTmdbClient:
    @staticmethod
    def add_media_directory_item(list_item, mode, title, ids, media_type="", batch=False):
        if mode == "movies" or (mode == "multi" and media_type == "movie"):
            context_menu = add_tmdb_movie_context_menu(mode, media_type, title=title, ids=ids)
            if is_trakt_auth():
                context_menu += (
                    add_trakt_watchlist_context_menu("movies", ids)
                    + add_trakt_watched_context_menu("movies", ids=ids)
                    + add_trakt_collection_context_menu("movies", ids)
                    + add_trakt_favorites_context_menu("movies", ids)
                    + add_trakt_custom_list_context_menu("movies", ids)
                )
            list_item.addContextMenuItems(context_menu)
            list_item.setProperty("IsPlayable", "true")
            is_folder = False
        elif mode == "tv" or (mode == "multi" and media_type == "tv"):
            context_menu = add_tmdb_show_context_menu(mode, ids=ids, title=title)
            if is_trakt_auth():
                context_menu += (
                    add_trakt_watchlist_context_menu("shows", ids)
                    + add_trakt_watched_context_menu("shows", ids=ids)
                    + add_trakt_collection_context_menu("shows", ids)
                    + add_trakt_favorites_context_menu("shows", ids)
                    + add_trakt_custom_list_context_menu("shows", ids)
                )
            list_item.addContextMenuItems(context_menu)
            is_folder = True
        else:
            is_folder = True

        url = build_url(
            "show_tmdb_item",
            mode=mode,
            submode="",
            id=ids.get("tmdb_id"),
            title=title,
            media_type=media_type,
        )
        if batch:
            return (url, list_item, is_folder)
        add_kodi_dir_item(
            list_item=list_item,
            url=url,
            is_folder=is_folder,
        )

    @staticmethod
    def show_years_items(mode, page, submode=None):
        set_pluging_category(translation(90027))
        directory_items = []
        current_year = datetime.now().year
        for year in range(current_year, 1899, -1):
            list_item = make_list_item(label=str(year))
            item = add_kodi_dir_item(
                list_item=list_item,
                url=build_url(
                    "search_tmdb_year",
                    mode=mode,
                    submode=submode,
                    year=year,
                    page=page,
                ),
                is_folder=True,
                icon_path="status.png",
                batch=True,
            )
            directory_items.append(item)
        add_directory_items_batch(directory_items)
        end_of_directory()
        if mode == "tv" or (mode == "anime" and submode == "tv"):
            apply_section_view("view.tvshows", content_type="tvshows")
        else:
            apply_section_view("view.movies", content_type="movies")

    @staticmethod
    def show_genres_items(mode, page, submode=None):
        set_pluging_category(translation(90025))
        path = (
            "show_genres"
            if mode == "tv" or (mode == "anime" and submode == "tv")
            else "movie_genres"
        )
        genres = tmdb_get(path=path)
        if genres is None or len(genres) == 0:
            notification("No genres found")
            end_of_directory()
            return

        directory_items = []
        for genre in genres:
            if isinstance(genre, AsObj):
                if genre.get("name") == "TV Movie":
                    continue
                list_item = make_list_item(label=genre["name"])
                item = add_kodi_dir_item(
                    list_item=list_item,
                    url=build_url(
                        "search_tmdb_genres",
                        mode=mode,
                        submode=submode,
                        genre_id=genre["id"],
                        page=page,
                    ),
                    is_folder=True,
                    icon_path=None,
                    batch=True,
                )
                directory_items.append(item)
        add_directory_items_batch(directory_items)
        end_of_directory()
        if mode == "tv" or (mode == "anime" and submode == "tv"):
            apply_section_view("view.tvshows", content_type="tvshows")
        else:
            apply_section_view("view.movies", content_type="movies")
