import pytest

from galaxy.schema.schema import ModelStoreFormat
from galaxy.short_term_storage import ShortTermStorageAllocator
from galaxy.webapps.galaxy.services.base import model_store_storage_target


class MockShortTermStorageAllocator(ShortTermStorageAllocator):
    def __init__(self, expected_filename: str, expected_mime_type: str) -> None:
        super().__init__()
        self.expected_filename = expected_filename
        self.expected_mime_type = expected_mime_type

    def new_target(self, filename, mime_type, duration=None, security=None):
        assert filename == self.expected_filename
        assert mime_type == self.expected_mime_type


@pytest.mark.parametrize(
    "file_name, model_store_format, expected",
    [
        ("My Cool Object", "txt", ("My-Cool-Object.txt", "text/plain")),
        ("!My Cool Object!", "json", ("My-Cool-Object.json", "application/json")),
        ("Hello₩◎ґʟⅾ", "xml", ("Hello.xml", "application/xml")),
        ("test", ModelStoreFormat.ROCRATE_ZIP.value, ("test.rocrate.zip", "application/zip")),
        ("test", ModelStoreFormat.TAR.value, ("test.tar", "application/x-tar")),
        ("test", ModelStoreFormat.TGZ.value, ("test.tgz", "application/x-tar")),
        ("test", ModelStoreFormat.TAR_DOT_GZ.value, ("test.tar.gz", "application/x-tar")),
        ("test", ModelStoreFormat.BAG_DOT_ZIP.value, ("test.bag.zip", "application/zip")),
        ("test", ModelStoreFormat.BAG_DOT_TAR.value, ("test.bag.tar", "application/x-tar")),
        ("test", ModelStoreFormat.BAG_DOT_TGZ.value, ("test.bag.tgz", "application/x-tar")),
        ("test", ModelStoreFormat.BCO_JSON.value, ("test.bco.json", "application/json")),
    ],
)
def test_model_store_storage_target(file_name: str, model_store_format: str, expected: tuple[str, str]):
    mock_sts_allocator = MockShortTermStorageAllocator(*expected)
    model_store_storage_target(
        short_term_storage_allocator=mock_sts_allocator, file_name=file_name, model_store_format=model_store_format
    )
