from unittest.mock import MagicMock, patch

from db.collection_assets import CollectionAsset
from magento.collection_landing_push import localize_magento_collection_assets
from shopify.collection_landing_push import (
    build_shopify_metafields_set_input,
    localize_shopify_collection_assets,
)


def _asset(url: str, filename: str, mime: str, *, image: bool) -> CollectionAsset:
    return CollectionAsset(
        source_url=url,
        content=b"asset-bytes",
        content_sha256="a" * 64,
        filename=filename,
        mime_type=mime,
        is_image=image,
    )


def test_shopify_collection_assets_become_shopify_cdn_urls():
    row = {
        "thumbnail_image_url": "https://source/thumb.jpg",
        "pdf_url": "https://source/spec.pdf",
        "hero_images": ["https://source/hero-1.jpg", "https://source/hero-2.jpg"],
    }
    assets = {
        row["thumbnail_image_url"]: _asset(row["thumbnail_image_url"], "thumb-a.jpg", "image/jpeg", image=True),
        row["pdf_url"]: _asset(row["pdf_url"], "spec-b.pdf", "application/pdf", image=False),
        row["hero_images"][0]: _asset(row["hero_images"][0], "hero-1-c.jpg", "image/jpeg", image=True),
        row["hero_images"][1]: _asset(row["hero_images"][1], "hero-2-d.jpg", "image/jpeg", image=True),
    }
    ids = {
        "thumb-a.jpg": ("https://cdn.shopify.com/thumb-a.jpg", "gid://shopify/MediaImage/1", False),
        "spec-b.pdf": ("https://cdn.shopify.com/spec-b.pdf", "gid://shopify/GenericFile/2", False),
        "hero-1-c.jpg": ("https://cdn.shopify.com/hero-1-c.jpg", "gid://shopify/MediaImage/3", False),
        "hero-2-d.jpg": ("https://cdn.shopify.com/hero-2-d.jpg", "gid://shopify/MediaImage/4", False),
    }
    with patch(
        "shopify.collection_landing_push.fetch_collection_asset",
        side_effect=lambda url: assets[url],
    ), patch(
        "shopify.collection_landing_push._ensure_shopify_file",
        side_effect=lambda _client, asset: ids[asset.filename],
    ):
        localized, uploaded = localize_shopify_collection_assets(MagicMock(), row)

    assert localized["thumbnail_image_url"] == "https://cdn.shopify.com/thumb-a.jpg"
    assert localized["pdf_url"] == "https://cdn.shopify.com/spec-b.pdf"
    assert localized["hero_images"] == [
        "https://cdn.shopify.com/hero-1-c.jpg",
        "https://cdn.shopify.com/hero-2-d.jpg",
    ]
    assert len(uploaded) == 4

    metafields = build_shopify_metafields_set_input("gid://shopify/Collection/9", localized)
    by_key = {row["key"]: row for row in metafields}
    assert by_key["thumbnail_image_url"]["type"] == "url"
    assert by_key["pdf_url"]["type"] == "url"
    assert by_key["hero_images"]["type"] == "json"
    assert by_key["hero_images"]["value"] == (
        '["https://cdn.shopify.com/hero-1-c.jpg", "https://cdn.shopify.com/hero-2-d.jpg"]'
    )


def test_magento_collection_assets_become_magento_media_urls():
    row = {
        "thumbnail_image_url": "https://source/thumb.jpg",
        "pdf_url": "https://source/spec.pdf",
        "hero_images": ["https://source/hero.jpg"],
    }
    assets = {
        row["thumbnail_image_url"]: _asset(row["thumbnail_image_url"], "thumb-a.jpg", "image/jpeg", image=True),
        row["pdf_url"]: _asset(row["pdf_url"], "spec-b.pdf", "application/pdf", image=False),
        row["hero_images"][0]: _asset(row["hero_images"][0], "hero-c.jpg", "image/jpeg", image=True),
    }
    api = MagicMock()
    api.upload_collection_asset.side_effect = lambda **kwargs: (
        200,
        {"url": f"https://magento.example/media/piehs/collections/{kwargs['filename']}"},
    )
    with patch(
        "magento.collection_landing_push.fetch_collection_asset",
        side_effect=lambda url: assets[url],
    ):
        localized, uploaded = localize_magento_collection_assets(api, row)

    assert localized["thumbnail_image_url"].startswith("https://magento.example/media/")
    assert localized["pdf_url"].endswith("spec-b.pdf")
    assert localized["hero_images"][0].endswith("hero-c.jpg")
    assert api.upload_collection_asset.call_count == 3
    assert len(uploaded) == 3


def test_relationship_only_push_does_not_upload_assets():
    row = {"thumbnail_image_url": "https://source/thumb.jpg"}
    localized, uploaded = localize_shopify_collection_assets(
        MagicMock(),
        row,
        field_keys={"parent_remote_id"},
    )
    assert localized == row
    assert uploaded == []
