from lib.nav import library_history
from lib.utils.views import library


def test_library_menu_adds_clear_context_menu(monkeypatch):
    added = []
    end_calls = []

    class _ListItem:
        def __init__(self, label=""):
            self.label = label
            self.context_menu = []

        def addContextMenuItems(self, items):
            self.context_menu.extend(items)

    monkeypatch.setattr(library_history, "build_list_item", lambda name, icon: _ListItem(name))
    monkeypatch.setattr(
        library_history,
        "translation",
        lambda value: {
            90202: "My TvShows",
            90203: "My Movies",
            90201: "Library",
            90021: "Upcoming Episodes",
            90690: "Clear All Items",
        }.get(value, str(value)),
    )
    monkeypatch.setattr(library_history, "set_pluging_category", lambda *args, **kwargs: None)
    monkeypatch.setattr(
        library_history,
        "end_of_directory",
        lambda *args, **kwargs: end_calls.append(kwargs),
    )
    monkeypatch.setattr(
        library_history,
        "container_update",
        lambda action, **params: (
            "Container.Update(plugin://plugin.video.jacktook?action={}{})".format(
                action,
                "".join(f"&{key}={value}" for key, value in params.items()),
            )
        ),
    )
    monkeypatch.setattr(
        library_history,
        "build_url",
        lambda action, **params: "plugin://plugin.video.jacktook?action={}{}".format(
            action, "".join(f"&{key}={value}" for key, value in params.items())
        ),
    )
    monkeypatch.setattr(
        library_history,
        "add_directory_items_batch",
        lambda items: added.extend(list_item for _url, list_item, _is_folder in items),
    )

    library_history.library_menu({})

    assert added[0].label == "My TvShows"
    assert added[1].label == "My Movies"
    assert added[0].context_menu == [
        (
            "Clear All Items",
            "Container.Update(plugin://plugin.video.jacktook?action=library_shows&clear=1)",
        )
    ]
    assert added[1].context_menu == [
        (
            "Clear All Items",
            "Container.Update(plugin://plugin.video.jacktook?action=library_movies&clear=1)",
        )
    ]
    assert end_calls == [{"cache": False}]


def test_maybe_clear_library_clears_requested_mode_when_confirmed(monkeypatch):
    cleared = []

    monkeypatch.setattr(library_history, "translation", lambda value: str(value))
    monkeypatch.setattr(library_history.Dialog, "yesno", lambda self, *args, **kwargs: True)
    monkeypatch.setattr(
        "lib.utils.views.library.clear_library_items",
        lambda params: cleared.append(params),
    )

    library_history._maybe_clear_library("tv", {"clear": 1})

    assert cleared == [{"mode": "tv"}]


def test_clear_library_items_removes_only_requested_mode(monkeypatch):
    database = {
        "Show 1": {"mode": "tv"},
        "Movie 1": {"mode": "movies"},
        "Movie 2": {"mode": "movie"},
    }

    monkeypatch.setattr(
        library.PickleDatabase,
        "get_key",
        lambda self, key: database,
    )
    monkeypatch.setattr(
        library.PickleDatabase,
        "delete_item",
        lambda self, key, subkey, commit=True: database.pop(subkey, None),
    )
    monkeypatch.setattr(
        library.PickleDatabase,
        "commit",
        lambda self: None,
    )
    deleted = []
    monkeypatch.setattr(library.cache, "delete", lambda key: deleted.append(key))
    monkeypatch.setattr(library, "notification", lambda *args, **kwargs: None)
    monkeypatch.setattr(library, "translation", lambda value: str(value))

    import xbmc

    monkeypatch.setattr(xbmc, "executebuiltin", lambda *args, **kwargs: None)

    removed = library.clear_library_items({"mode": "movies"})

    assert database == {"Show 1": {"mode": "tv"}}
    assert deleted == ["library_view|tv", "library_view|movies"]
    assert removed == 2
