from unittest.mock import MagicMock, patch

import pytest

from lib.clients.prowlarr import Prowlarr


@pytest.fixture
def prowlarr_client():
    mock_notification = MagicMock()
    with patch("lib.clients.prowlarr.get_prowlarr_timeout", return_value=10):
        client = Prowlarr(
            host="http://localhost",
            apikey="testapikey",
            port="9696",
            notification=mock_notification,
        )
    return client


def test_prowlarr_initialization(prowlarr_client):
    assert prowlarr_client.base_url == "http://localhost:9696/api/v1/search"
    assert prowlarr_client.apikey == "testapikey"


def test_prowlarr_query_with_year_appended(prowlarr_client):
    with patch.object(prowlarr_client.session, "get") as mock_get:
        mock_response = MagicMock()
        mock_response.status_code = 200
        mock_response.json.return_value = []
        mock_get.return_value = mock_response

        with patch("lib.clients.prowlarr.get_prowlarr_timeout", return_value=10):
            prowlarr_client.search("Inception", "movies", year=2010)

        call_args = mock_get.call_args
        params = call_args[1]["params"]
        assert params["query"] == "Inception 2010"
        assert params["categories"] == [2000, 8000]


def test_prowlarr_query_without_year(prowlarr_client):
    with patch.object(prowlarr_client.session, "get") as mock_get:
        mock_response = MagicMock()
        mock_response.status_code = 200
        mock_response.json.return_value = []
        mock_get.return_value = mock_response

        with patch("lib.clients.prowlarr.get_prowlarr_timeout", return_value=10):
            prowlarr_client.search("Inception", "movies")

        call_args = mock_get.call_args
        params = call_args[1]["params"]
        assert params["query"] == "Inception"
        assert params["categories"] == [2000, 8000]


def test_prowlarr_search_variant_mapping(prowlarr_client):
    with patch.object(prowlarr_client.session, "get") as mock_get:
        mock_response = MagicMock()
        mock_response.status_code = 200
        mock_response.json.return_value = []
        mock_get.return_value = mock_response

        with patch("lib.clients.prowlarr.get_prowlarr_timeout", return_value=10):
            # Test with variant and year
            prowlarr_client.search("Spirited Away", "movies", variant=None, year=2001)

        call_args = mock_get.call_args
        params = call_args[1]["params"]
        # Year should be appended to query for movies
        assert params["query"] == "Spirited Away 2001"


def test_prowlarr_year_not_appended_for_tv(prowlarr_client):
    with patch.object(prowlarr_client.session, "get") as mock_get:
        mock_response = MagicMock()
        mock_response.status_code = 200
        mock_response.json.return_value = []
        mock_get.return_value = mock_response

        with patch("lib.clients.prowlarr.get_prowlarr_timeout", return_value=10):
            with patch("lib.clients.prowlarr.get_setting", return_value=False):
                prowlarr_client.search("Breaking Bad", "tv", season=1, episode=1, year=2008)

        call_args = mock_get.call_args
        params = call_args[1]["params"]
        # Year should NOT be appended for TV shows
        assert "2008" not in params["query"]
        assert "S01E01" in params["query"]
