from unittest.mock import MagicMock

from lib.utils.views import library


def test_get_library_entries_prioritizes_stremio_metadata(monkeypatch):
    monkeypatch.setattr(library.cache, "get", lambda key: None)
    monkeypatch.setattr(library.cache, "set", lambda *args, **kwargs: None)

    tmdb_calls = []
    monkeypatch.setattr(
        library, "tmdb_get", lambda *args, **kwargs: tmdb_calls.append((args, kwargs))
    )

    entries = library._get_library_entries(
        [
            (
                "Kitsu Show",
                {
                    "source": "stremio_catalog",
                    "title": "Kitsu Show",
                    "overview": "Catalog plot",
                    "poster": "poster.jpg",
                    "fanart": "fanart.jpg",
                    "genres": ["Anime"],
                    "mode": "tv",
                    "ids": {"imdb_id": "tt123", "original_id": "kitsu:show"},
                },
            )
        ],
        "tv",
    )

    assert tmdb_calls == []
    assert entries[0]["is_stremio"] is True
    assert entries[0]["details"]["title"] == "Kitsu Show"
    assert entries[0]["details"]["overview"] == "Catalog plot"
    assert entries[0]["details"]["poster"] == "poster.jpg"


def test_get_library_item_url_uses_stremio_seasons_route_for_shows():
    entry = {
        "title": "Kitsu Show",
        "is_stremio": True,
        "data": {
            "title": "Kitsu Show",
            "addon_url": "https://anime-kitsu.strem.fun",
            "catalog_type": "anime",
            "meta_id": "kitsu:123",
            "ids": {"original_id": "kitsu:123"},
        },
    }

    url = library._get_library_item_url(entry, "tv")

    assert url.startswith("plugin://")
    assert "action=list_stremio_seasons" in url
    assert "meta_id=kitsu%3A123" in url


def test_get_library_item_url_uses_stremio_movie_route_for_movies():
    entry = {
        "title": "Kitsu Movie",
        "is_stremio": True,
        "data": {
            "title": "Kitsu Movie",
            "overview": "Catalog plot",
            "poster": "poster.jpg",
            "fanart": "fanart.jpg",
            "genres": ["Anime"],
            "addon_url": "https://anime-kitsu.strem.fun",
            "catalog_type": "anime",
            "meta_id": "kitsu:456",
            "ids": {"original_id": "kitsu:456"},
        },
    }

    url = library._get_library_item_url(entry, "movies")

    assert url.startswith("plugin://")
    assert "action=list_stremio_movie" in url
    assert "meta_id=kitsu%3A456" in url


def test_show_library_items_renders_stremio_entry_without_tmdb(monkeypatch):
    added = []

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

        def getVideoInfoTag(self):
            return MagicMock()

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

        def setArt(self, *args, **kwargs):
            pass

        def setProperty(self, key, value):
            self.properties[key] = value

    monkeypatch.setattr(
        library,
        "make_list_item",
        lambda label="", path="", offscreen=True: _ListItem(label=label),
    )
    monkeypatch.setattr(library, "set_pluging_category", lambda *args, **kwargs: None)
    monkeypatch.setattr(library, "setContent", lambda *args, **kwargs: None)
    monkeypatch.setattr(library, "end_of_directory", lambda *args, **kwargs: None)
    monkeypatch.setattr(
        library,
        "translation",
        lambda value: {90202: "My Shows", 90204: "Remove from Library"}.get(value, str(value)),
    )
    monkeypatch.setattr(library, "set_media_infoTag", lambda *args, **kwargs: None)
    monkeypatch.setattr(
        library,
        "add_directory_items_batch",
        lambda items: added.extend(
            (url, listitem.label, is_folder) for url, listitem, is_folder in items
        ),
    )
    monkeypatch.setattr(
        library.PickleDatabase,
        "get_key",
        lambda self, key: {
            "Kitsu Show": {
                "source": "stremio_catalog",
                "title": "Kitsu Show",
                "overview": "Catalog plot",
                "poster": "poster.jpg",
                "fanart": "fanart.jpg",
                "mode": "tv",
                "addon_url": "https://anime-kitsu.strem.fun",
                "catalog_type": "anime",
                "meta_id": "kitsu:123",
                "ids": {"original_id": "kitsu:123"},
                "timestamp": "Sun, 05 Apr 2026 12:00 AM",
            }
        },
    )
    monkeypatch.setattr(library.cache, "get", lambda key: None)
    monkeypatch.setattr(library.cache, "set", lambda *args, **kwargs: None)
    monkeypatch.setattr(library, "tmdb_get", lambda *args, **kwargs: None)

    library.show_library_items(mode="tv")

    assert added == [(added[0][0], "Kitsu Show", True)]
    assert "action=list_stremio_seasons" in added[0][0]


def test_library_treats_entries_with_stremio_route_fields_as_stremio(monkeypatch):
    monkeypatch.setattr(library.cache, "get", lambda key: None)
    monkeypatch.setattr(library.cache, "set", lambda *args, **kwargs: None)

    tmdb_calls = []
    monkeypatch.setattr(
        library, "tmdb_get", lambda *args, **kwargs: tmdb_calls.append((args, kwargs))
    )

    entries = library._get_library_entries(
        [
            (
                "Jigokuraku 2nd Season",
                {
                    "title": "Jigokuraku 2nd Season",
                    "overview": "Catalog plot",
                    "poster": "poster.jpg",
                    "fanart": "fanart.jpg",
                    "mode": "tv",
                    "addon_url": "https://anime-kitsu.strem.fun",
                    "catalog_type": "anime",
                    "meta_id": "kitsu:jigokuraku-2",
                    "ids": {"imdb_id": "tt123"},
                },
            )
        ],
        "tv",
    )

    assert tmdb_calls == []
    assert entries[0]["is_stremio"] is True
    assert entries[0]["data"]["meta_id"] == "kitsu:jigokuraku-2"


def test_get_library_item_url_uses_original_id_when_meta_id_missing():
    entry = {
        "title": "Jigokuraku 2nd Season",
        "is_stremio": True,
        "data": {
            "title": "Jigokuraku 2nd Season",
            "addon_url": "https://anime-kitsu.strem.fun",
            "catalog_type": "anime",
            "ids": {"original_id": "kitsu:jigokuraku-2"},
        },
    }

    url = library._get_library_item_url(entry, "tv")

    assert url.startswith("plugin://")
    assert "action=list_stremio_seasons" in url
    assert "meta_id=kitsu%3Ajigokuraku-2" in url
