import os
from datetime import timedelta

from xbmcgui import Dialog
from xbmcplugin import addDirectoryItem, endOfDirectory

from lib.db.cached import cache
from lib.utils.general.items_menus import history_menu_items, library_menu_items
from lib.utils.general.utils import (
    build_list_item,
    clear_history_by_type,
    set_pluging_category,
)
from lib.utils.kodi.settings import get_cache_expiration
from lib.utils.kodi.utils import (
    ADDON_HANDLE,
    ADDON_PATH,
    add_directory_items_batch,
    apply_section_view,
    build_url,
    container_update,
    end_of_directory,
    finish_action,
    kodi_play_media,
    kodilog,
    make_list_item,
    notification,
    show_keyboard,
    translation,
)
from lib.utils.views.last_files import show_last_files
from lib.utils.views.last_titles import show_last_titles
from lib.utils.views.weekly_calendar import show_weekly_calendar


def _maybe_clear_library(mode, params):
    from lib.utils.views.library import clear_library_items

    should_clear = str(params.get("clear", "0")).lower() in ("1", "true", "yes")
    if not should_clear:
        return

    confirmed = Dialog().yesno(translation(90201), translation(90691))
    if not confirmed:
        return

    clear_library_items({"mode": mode})


def _render_menu(items, cache_listing=True):
    directory_items = []
    for item in items:
        if "condition" in item and not item["condition"]():
            continue

        name = item["name"]
        if isinstance(name, int):
            name = translation(name)

        list_item = build_list_item(name, item["icon"])
        params = item.get("params", {})
        url = build_url(item["action"], **params)

        context_menu = []
        for context_item in item.get("context_menu", []):
            label = context_item["label"]
            if isinstance(label, int):
                label = translation(label)
            context_menu.append(
                (
                    label,
                    container_update(context_item["action"], **context_item.get("params", {})),
                )
            )
        if context_menu:
            list_item.addContextMenuItems(context_menu)

        directory_items.append((url, list_item, True))

    add_directory_items_batch(directory_items)
    end_of_directory(cache=cache_listing)


def history_menu(params):
    set_pluging_category(translation(90017))
    _render_menu(history_menu_items)
    apply_section_view("view.history")


def library_menu(params):
    set_pluging_category(translation(90201))
    _render_menu(library_menu_items, cache_listing=False)
    apply_section_view("view.library")


def continue_watching_menu(params):
    from lib.utils.views.continue_watching import show_continue_watching

    show_continue_watching()


def remove_from_continue_watching(params):
    from lib.utils.views.continue_watching import remove_continue_watching_item

    remove_continue_watching_item(params)


def library_shows(params):
    from lib.utils.views.library import show_library_items

    _maybe_clear_library("tv", params)
    show_library_items(mode="tv")


def library_movies(params):
    from lib.utils.views.library import show_library_items

    _maybe_clear_library("movies", params)
    show_library_items(mode="movies")


def library_calendar(params):
    show_weekly_calendar(library=True)


def remove_from_library(params):
    from lib.utils.views.library import remove_library_item

    remove_library_item(params)


def clear_library(params):
    from lib.utils.views.library import clear_library_items, show_library_items

    kodilog(f"clear_library action invoked with params={params}")

    confirmed = Dialog().yesno(translation(90201), translation(90691))
    kodilog(f"clear_library confirmation result={confirmed}")
    if not confirmed:
        return

    clear_library_items(params)
    show_library_items(mode=params.get("mode", "tv"))


def add_to_library(params):
    import json

    from lib.utils.general.utils import add_to_library as add_lib

    data = params.get("data")
    if data:
        add_lib(json.loads(data))

    Dialog().notification(translation(90069), translation(90205))


def search_direct(params):
    set_pluging_category(translation(90011))
    mode = params.get("mode")
    query = params.get("query", "")
    is_clear = params.get("is_clear", False)
    is_keyboard = params.get("is_keyboard", True)
    update_listing = params.get("update_listing", False)
    rename = params.get("rename", False)

    if is_clear:
        cache.clear_list(key=mode)
        is_keyboard = False

    if rename or is_clear:
        update_listing = True

    if is_keyboard:
        text = show_keyboard(id=30243, default=query)
        if text:
            cache.add_to_list(
                key=mode,
                item=(mode, text),
                expires=timedelta(hours=get_cache_expiration()),
            )

    list_item = make_list_item(label=translation(90006))
    list_item.setArt({"icon": os.path.join(ADDON_PATH, "resources", "img", "search.png")})
    addDirectoryItem(
        ADDON_HANDLE,
        build_url("search_direct", mode=mode),
        list_item,
        isFolder=True,
    )

    for item_mode, text in cache.get_list(key=mode):
        list_item = make_list_item(label=f"[I]{text}[/I]")
        list_item.setArt({"icon": os.path.join(ADDON_PATH, "resources", "img", "search.png")})
        list_item.setProperty("IsPlayable", "true")
        list_item.addContextMenuItems(
            [
                (
                    translation(90049),
                    kodi_play_media(
                        name="search",
                        mode=item_mode,
                        query=text,
                        rescrape=True,
                        direct=True,
                    ),
                ),
                (
                    translation(90655),
                    container_update(
                        "search_direct",
                        mode=item_mode,
                        query=text,
                        rename=True,
                    ),
                ),
            ]
        )
        addDirectoryItem(
            ADDON_HANDLE,
            build_url("search", mode=item_mode, query=text, direct=True),
            list_item,
            isFolder=False,
        )

    list_item = make_list_item(label="Clear Searches")
    list_item.setArt({"icon": os.path.join(ADDON_PATH, "resources", "img", "clear.png")})
    addDirectoryItem(
        ADDON_HANDLE,
        build_url("search_direct", mode=mode, is_clear=True),
        list_item,
        isFolder=True,
    )
    endOfDirectory(ADDON_HANDLE, updateListing=update_listing)
    apply_section_view("view.main")


def clear_history(params):
    clear_history_by_type(type=params.get("type"))
    notification(translation(90114))


def clear_search_history(params):
    import xbmc

    finish_action()
    cache.clear_list(key="multi")
    cache.clear_list(key="direct")
    notification(translation(90114))
    xbmc.executebuiltin("Container.Refresh")


def files_history(params):
    show_last_files()


def titles_history(params):
    show_last_titles(params)


def titles_calendar(params):
    show_weekly_calendar()
