from unittest.mock import MagicMock

import pytest

from lib.api.debrid.base import ProviderException
from lib.clients.debrid.realdebrid import RealDebridHelper


def test_get_link_multi_file_movie_uses_largest_selected_file():
    helper = RealDebridHelper.__new__(RealDebridHelper)
    helper.client = MagicMock()
    helper.add_magnet = MagicMock(return_value="torrent-id")

    helper.client.get_torrent_info.return_value = {
        "links": ["link-small", "link-large", "link-medium"],
        "files": [
            {"selected": 1, "bytes": 100},
            {"selected": 1, "bytes": 300},
            {"selected": 1, "bytes": 200},
        ],
    }
    helper.client.create_download_link.side_effect = lambda link: {
        "download": f"https://download/{link}"
    }

    result = helper.get_link("info-hash", {})

    assert result is not None
    assert result["url"] == "https://download/link-large"
    assert "is_pack" not in result


def test_get_link_multi_file_movie_falls_back_to_pack_when_no_selected_files():
    helper = RealDebridHelper.__new__(RealDebridHelper)
    helper.client = MagicMock()
    helper.add_magnet = MagicMock(return_value="torrent-id")

    helper.client.get_torrent_info.return_value = {
        "links": ["link-one", "link-two"],
        "files": [{"selected": 0, "bytes": 100}, {"selected": 0, "bytes": 200}],
    }

    result = helper.get_link("info-hash", {})

    assert result is not None
    assert result["is_pack"] is True
    assert "url" not in result


def test_get_link_single_file_movie_returns_download_url():
    helper = RealDebridHelper.__new__(RealDebridHelper)
    helper.client = MagicMock()
    helper.add_magnet = MagicMock(return_value="torrent-id")

    helper.client.get_torrent_info.return_value = {
        "links": ["link-movie"],
        "files": [{"path": "/Movie.2025.1080p.mkv", "selected": 1, "bytes": 1000}],
    }
    helper.client.create_download_link.return_value = {"download": "https://download/movie"}

    result = helper.get_link("info-hash", {})

    assert result is not None
    assert result["url"] == "https://download/movie"
    assert "is_pack" not in result


def test_get_link_single_file_archive_raises_packed_release_error():
    helper = RealDebridHelper.__new__(RealDebridHelper)
    helper.client = MagicMock()
    helper.add_magnet = MagicMock(return_value="torrent-id")

    helper.client.get_torrent_info.return_value = {
        "links": ["link-rar"],
        "files": [{"path": "/Movie.2025.1080p.rar", "selected": 1, "bytes": 1000}],
    }

    with pytest.raises(ProviderException, match="Real-Debrid cannot directly play packed releases"):
        helper.get_link("info-hash", {})
