from typing import Dict

import pytest
from expected_download import assert_expected_downloads
from expected_transaction_log import assert_transaction_log_matches

from ytdl_sub.subscriptions.subscription import Subscription


@pytest.fixture
def square_thumbnail_subscription_dict(output_directory) -> Dict:
    return {
        "preset": "Jellyfin Music Videos",
        "output_options": {"output_directory": output_directory},
        "square_thumbnail": "{perform_square_thumbnail}",
        "embed_thumbnail": "{perform_embed_thumbnail}",
        "overrides": {
            "music_video_artist": "JMC",
            "url": "https://your.name.here",
            "perform_square_thumbnail": True,
            "perform_embed_thumbnail": False,
        },
    }


class TestThumbnailPlugins:
    @pytest.mark.parametrize("dry_run", [True, False])
    @pytest.mark.parametrize("embed_thumbnail", [True, False])
    def test_thumbnail(
        self,
        config,
        subscription_name,
        square_thumbnail_subscription_dict,
        output_directory,
        mock_download_collection_entries,
        dry_run,
        embed_thumbnail,
    ):
        square_thumbnail_subscription_dict["overrides"]["perform_embed_thumbnail"] = embed_thumbnail

        subscription = Subscription.from_dict(
            config=config,
            preset_name=subscription_name,
            preset_dict=square_thumbnail_subscription_dict,
        )

        with mock_download_collection_entries(
            is_youtube_channel=False,
            num_urls=1,
            is_extracted_audio=False,
            is_dry_run=dry_run,
        ):
            transaction_log = subscription.download(dry_run=dry_run)

        expected_filename = "square_thumbnail"
        if embed_thumbnail:
            expected_filename = "embedded_square_thumbnail"

        assert_transaction_log_matches(
            output_directory=output_directory,
            transaction_log=transaction_log,
            transaction_log_summary_file_name=f"plugins/thumbnail/{expected_filename}.txt",
        )
        assert_expected_downloads(
            output_directory=output_directory,
            dry_run=dry_run,
            expected_download_summary_file_name=f"plugins/thumbnail/{expected_filename}.json",
        )
