from unittest.mock import MagicMock, patch

from lib.clients.tmdb.utils.utils import (
    filter_excluded_languages,
    get_excluded_languages,
)


class TestGetExcludedLanguages:
    def test_returns_empty_list_by_default(self):
        with patch("lib.clients.tmdb.utils.utils.get_setting", return_value="[]"):
            assert get_excluded_languages() == []

    def test_returns_parsed_json(self):
        with patch("lib.clients.tmdb.utils.utils.get_setting", return_value='["ja", "ko"]'):
            assert get_excluded_languages() == ["ja", "ko"]

    def test_returns_empty_on_invalid_json(self):
        with patch("lib.clients.tmdb.utils.utils.get_setting", return_value="not-json"):
            assert get_excluded_languages() == []


class TestFilterExcludedLanguages:
    def test_returns_all_when_none_excluded(self):
        results = [
            MagicMock(original_language="en"),
            MagicMock(original_language="ja"),
        ]
        with patch("lib.clients.tmdb.utils.utils.get_excluded_languages", return_value=[]):
            filtered = filter_excluded_languages(results)
        assert len(filtered) == 2

    def test_filters_excluded_languages(self):
        results = [
            MagicMock(original_language="en"),
            MagicMock(original_language="ja"),
            MagicMock(original_language="ko"),
        ]
        with patch(
            "lib.clients.tmdb.utils.utils.get_excluded_languages",
            return_value=["ja", "ko"],
        ):
            filtered = filter_excluded_languages(results)
        assert len(filtered) == 1
        assert filtered[0].original_language == "en"

    def test_allows_force_allow_lang(self):
        results = [
            MagicMock(original_language="en"),
            MagicMock(original_language="ja"),
        ]
        with patch(
            "lib.clients.tmdb.utils.utils.get_excluded_languages",
            return_value=["ja"],
        ):
            filtered = filter_excluded_languages(results, force_allow_lang="ja")
        assert len(filtered) == 2
        assert filtered[0].original_language == "en"
        assert filtered[1].original_language == "ja"

    def test_handles_dict_results(self):
        results = [
            {"original_language": "en"},
            {"original_language": "ja"},
        ]
        with patch(
            "lib.clients.tmdb.utils.utils.get_excluded_languages",
            return_value=["ja"],
        ):
            filtered = filter_excluded_languages(results)
        assert len(filtered) == 1
        assert filtered[0]["original_language"] == "en"

    def test_handles_none_original_language(self):
        results = [
            MagicMock(original_language="en"),
            MagicMock(original_language=None),
        ]
        with patch(
            "lib.clients.tmdb.utils.utils.get_excluded_languages",
            return_value=["ja"],
        ):
            filtered = filter_excluded_languages(results)
        assert len(filtered) == 2
