from db.models import MasterCollectionRegistry, MasterProduct, MasterProductCollectionMembership, MasterProductImage
from db.shared_sku_image_cleanup import (
    cleanup_shared_sku_collection_images,
    enqueue_shared_sku_image_cleanup_outbound,
    sync_shared_sku_images_from_manual_taxonomy,
)
from db.master_product_images import sync_package_vignette_images
from db.manual_taxonomy_assignments import replace_manual_taxonomy_assignments


def test_cleanup_shared_sku_collection_images_removes_only_collection_assets(catalog_intent_session):
    session = catalog_intent_session
    session.add(
        MasterCollectionRegistry(
            code="MAYA",
            name="Maya Snow White",
            path_slug="kitchen-cabinets/maya-snow-white",
            is_active=True,
        )
    )
    session.add(
        MasterProduct(
            sku="PB-PW-BF3",
            name="Pearl White Base Filler",
            category_l1="Kitchen Cabinets",
            collection="Harriet Pearl White",
            membership_mode="shared",
            row_hash="img-cleanup-1",
            is_active=True,
        )
    )
    session.add(
        MasterProductCollectionMembership(
            master_sku="PB-PW-BF3",
            path_slug="kitchen-cabinets/maya-snow-white",
            collection_name="Maya Snow White",
            is_active=True,
        )
    )
    session.flush()
    product = session.query(MasterProduct).filter(MasterProduct.sku == "PB-PW-BF3").one()
    session.add_all(
        [
            MasterProductImage(
                product_id=product.id,
                sku=product.sku,
                file_name="PB-PW-BF3-CLOSE.png",
                image_url="https://cdn.example.com/pb-close.png",
                image_role="default",
                sort_order=1,
            ),
            MasterProductImage(
                product_id=product.id,
                sku=product.sku,
                file_name="PB-PW-BF3-MAYA-vignette.png",
                image_url="https://cdn.example.com/pb-vignette.png",
                image_role="vignette",
                sort_order=2,
            ),
            MasterProductImage(
                product_id=product.id,
                sku=product.sku,
                file_name="PB-PW-BF3-MAYA-hero.png",
                image_url="https://cdn.example.com/pb-hero.png",
                image_role="collection_hero",
                sort_order=3,
            ),
        ]
    )
    session.flush()

    result = cleanup_shared_sku_collection_images(
        session,
        collection_codes=["MAYA"],
        dry_run=False,
    )

    remaining = session.query(MasterProductImage).filter(MasterProductImage.sku == "PB-PW-BF3").all()
    assert result["scope"]["target_skus"] == ["PB-PW-BF3"]
    assert result["removable_row_count"] == 2
    assert result["deleted_row_count"] == 2
    assert len(remaining) == 1
    assert remaining[0].image_role == "default"


def test_cleanup_shared_sku_collection_images_dry_run_leaves_rows_intact(catalog_intent_session):
    session = catalog_intent_session
    session.add(
        MasterCollectionRegistry(
            code="ASW",
            name="Anna Snow White",
            path_slug="kitchen-cabinets/anna-snow-white",
            is_active=True,
        )
    )
    session.add(
        MasterProduct(
            sku="PB-CH-TK8",
            name="Touch Up Kit",
            category_l1="Kitchen Cabinets",
            collection="Anna Snow White",
            membership_mode="shared",
            row_hash="img-cleanup-2",
            is_active=True,
        )
    )
    session.add(
        MasterProductCollectionMembership(
            master_sku="PB-CH-TK8",
            path_slug="kitchen-cabinets/anna-snow-white",
            collection_name="Anna Snow White",
            is_active=True,
        )
    )
    session.flush()
    product = session.query(MasterProduct).filter(MasterProduct.sku == "PB-CH-TK8").one()
    session.add(
        MasterProductImage(
            product_id=product.id,
            sku=product.sku,
            file_name="PB-CH-TK8-ASW-vignette.png",
            image_url="https://cdn.example.com/tk8-vignette.png",
            image_role="vignette",
            sort_order=1,
        )
    )
    session.flush()

    result = cleanup_shared_sku_collection_images(
        session,
        collection_path_slugs=["kitchen-cabinets/anna-snow-white"],
        dry_run=True,
    )

    remaining = session.query(MasterProductImage).filter(MasterProductImage.sku == "PB-CH-TK8").all()
    assert result["removable_row_count"] == 1
    assert result["deleted_row_count"] == 0
    assert len(remaining) == 1


def test_enqueue_shared_sku_image_cleanup_outbound_supports_multiple_shopify_connections(
    catalog_intent_session,
):
    session = catalog_intent_session

    result = enqueue_shared_sku_image_cleanup_outbound(
        session,
        skus=["PB-PW-BF3", "PB-CH-TK8"],
        magento_connections=[
            {"id": 1, "native_id": 1, "channel_type": "magento", "channel_code": "magento-main"},
        ],
        shopify_connections=[
            {"id": 1000001, "native_id": 1, "channel_type": "shopify", "channel_code": "shopify-us", "store_code": "us"},
            {"id": 1000002, "native_id": 2, "channel_type": "shopify", "channel_code": "shopify-ca", "store_code": "ca"},
        ],
        dry_run=False,
    )

    assert result["queued"] == 4
    assert result["would_queue"] == 0
    assert [job["job_type"] for job in result["jobs"]] == [
        "media_cleanup",
        "push_images",
        "push_images",
        "push_images",
    ]
    assert [job["channel"] for job in result["jobs"]] == [
        "magento",
        "magento",
        "shopify",
        "shopify",
    ]


def test_sync_shared_sku_images_from_manual_taxonomy_copies_base_images(catalog_intent_session):
    session = catalog_intent_session
    session.add(
        MasterCollectionRegistry(
            code="ACH",
            name="Anna Caramel Harvest",
            path_slug="kitchen-cabinets/anna-caramel-harvest",
            is_active=True,
            aliases={"source_collection_code": "ACH", "alias_codes": ["ACH"]},
        )
    )
    native = MasterProduct(
        sku="ACH-TK8",
        name="Toe Kick Native",
        source_item="TK8",
        collection="Anna Caramel Harvest",
        membership_mode="native",
        row_hash="native-tk8",
        is_active=True,
    )
    shared = MasterProduct(
        sku="PB-CH-TK8",
        name="Toe Kick Shared",
        source_item="TK8",
        membership_mode="shared",
        row_hash="shared-tk8",
        is_active=True,
    )
    session.add_all([native, shared])
    session.flush()
    session.add(
        MasterProductCollectionMembership(
            master_sku="PB-CH-TK8",
            path_slug="kitchen-cabinets/anna-caramel-harvest",
            collection_name="Anna Caramel Harvest",
            is_active=True,
        )
    )
    session.add_all(
        [
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="ACH-TK8-CLOSE.png",
                image_url="https://cdn.example.com/ach-tk8-close.png",
                image_role="closed",
                sort_order=0,
            ),
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="ACH-TK8-OPEN.png",
                image_url="https://cdn.example.com/ach-tk8-open.png",
                image_role="open",
                sort_order=1,
            ),
            MasterProductImage(
                product_id=shared.id,
                sku=shared.sku,
                file_name="TK8_Misc_ToeKick_Uni.png",
                image_url="https://cdn.example.com/wrong-image.png",
                image_role="diagram",
                sort_order=0,
            ),
        ]
    )
    replace_manual_taxonomy_assignments(
        session,
        {
            "templates": [
                {
                    "source_sku": "TK8",
                    "canonical_taxonomy_path_slug": "kitchen-cabinets/accessories/toe-kick",
                    "collections": [
                        {
                            "collection_code": "ACH",
                            "source_collection_code": "ACH",
                            "sku_prefix": "ACH",
                            "collection_name": "Anna Caramel Harvest",
                            "collection_path_slug": "kitchen-cabinets/anna-caramel-harvest",
                            "master_sku": "ACH-TK8",
                        }
                    ],
                }
            ]
        },
    )
    session.flush()

    result = sync_shared_sku_images_from_manual_taxonomy(
        session,
        master_skus=["PB-CH-TK8"],
        dry_run=False,
    )

    images = session.query(MasterProductImage).filter(MasterProductImage.sku == "PB-CH-TK8").order_by(MasterProductImage.sort_order).all()
    assert result["updated"] == 1
    assert [row.file_name for row in images] == ["ACH-TK8-CLOSE.png", "ACH-TK8-OPEN.png"]
    shared_row = session.query(MasterProduct).filter(MasterProduct.sku == "PB-CH-TK8").one()
    assert shared_row.base_sku == "ACH-TK8"


def test_sync_shared_sku_images_from_manual_taxonomy_skips_ambiguous_memberships(catalog_intent_session):
    session = catalog_intent_session
    session.add_all(
        [
            MasterCollectionRegistry(
                code="ACH",
                name="Anna Caramel Harvest",
                path_slug="kitchen-cabinets/anna-caramel-harvest",
                is_active=True,
                aliases={"source_collection_code": "ACH", "alias_codes": ["ACH"]},
            ),
            MasterCollectionRegistry(
                code="ASW",
                name="Anna Snow White",
                path_slug="kitchen-cabinets/anna-snow-white",
                is_active=True,
                aliases={"source_collection_code": "ASW", "alias_codes": ["ASW"]},
            ),
        ]
    )
    shared = MasterProduct(
        sku="PB-MULTI-CB",
        name="Shared Sample",
        source_item="CB",
        membership_mode="shared",
        row_hash="shared-cb",
        is_active=True,
    )
    session.add(shared)
    session.flush()
    session.add_all(
        [
            MasterProductCollectionMembership(
                master_sku="PB-MULTI-CB",
                path_slug="kitchen-cabinets/anna-caramel-harvest",
                collection_name="Anna Caramel Harvest",
                is_active=True,
            ),
            MasterProductCollectionMembership(
                master_sku="PB-MULTI-CB",
                path_slug="kitchen-cabinets/anna-snow-white",
                collection_name="Anna Snow White",
                is_active=True,
            ),
        ]
    )
    replace_manual_taxonomy_assignments(
        session,
        {
            "templates": [
                {
                    "source_sku": "CB",
                    "canonical_taxonomy_path_slug": "kitchen-cabinets/accessories/sample-color-block",
                    "collections": [
                        {
                            "collection_code": "ACH",
                            "sku_prefix": "ACH",
                            "collection_name": "Anna Caramel Harvest",
                            "collection_path_slug": "kitchen-cabinets/anna-caramel-harvest",
                            "master_sku": "ACH-CB",
                        },
                        {
                            "collection_code": "ASW",
                            "sku_prefix": "ASW",
                            "collection_name": "Anna Snow White",
                            "collection_path_slug": "kitchen-cabinets/anna-snow-white",
                            "master_sku": "ASW-CB",
                        },
                    ],
                }
            ]
        },
    )
    session.flush()

    result = sync_shared_sku_images_from_manual_taxonomy(
        session,
        master_skus=["PB-MULTI-CB"],
        dry_run=True,
    )

    assert result["updated"] == 0
    assert result["sample"][0]["reason"] == "ambiguous_base_sku"


def test_sync_shared_sku_images_from_manual_taxonomy_fallback_uses_collection_code_and_excludes_vignettes(
    catalog_intent_session,
):
    session = catalog_intent_session
    session.add(
        MasterCollectionRegistry(
            code="ACH",
            name="Anna Caramel Harvest",
            path_slug="kitchen-cabinets/anna-caramel-harvest",
            is_active=True,
            aliases={"source_collection_code": "ACH", "alias_codes": ["ACH"]},
        )
    )
    native = MasterProduct(
        sku="ACH-TOUCH UP KIT",
        name="Touch Up Native",
        source_item="TOUCH UP KIT",
        collection="Anna Caramel Harvest",
        membership_mode="native",
        row_hash="native-touch-up",
        is_active=True,
    )
    shared = MasterProduct(
        sku="PB-CH-TOUCH UP KIT",
        name="Touch Up Shared",
        source_item="TOUCH UP KIT",
        membership_mode="shared",
        row_hash="shared-touch-up",
        is_active=True,
    )
    session.add_all([native, shared])
    session.flush()
    session.add(
        MasterProductCollectionMembership(
            master_sku="PB-CH-TOUCH UP KIT",
            path_slug="kitchen-cabinets/anna-caramel-harvest",
            collection_name="Anna Caramel Harvest",
            is_active=True,
        )
    )
    session.add_all(
        [
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="AnnaCaramelHarvest_Door.jpg",
                image_url="https://cdn.example.com/ach-touch-door.jpg",
                image_role="sample_door",
                sort_order=0,
            ),
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="AnnaCaramelHarvest_Vignette1a.jpg",
                image_url="https://cdn.example.com/ach-touch-vignette.jpg",
                image_role="vignette",
                sort_order=1,
            ),
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="Touch Up Kit_Misc_TouchUpKit_Uni.png",
                image_url="https://cdn.example.com/ach-touch-diagram.png",
                image_role="diagram",
                sort_order=2,
            ),
            MasterProductImage(
                product_id=shared.id,
                sku=shared.sku,
                file_name="wrong-wall-image.png",
                image_url="https://cdn.example.com/wrong-wall-image.png",
                image_role="default",
                sort_order=0,
            ),
        ]
    )
    session.flush()

    result = sync_shared_sku_images_from_manual_taxonomy(
        session,
        master_skus=["PB-CH-TOUCH UP KIT"],
        dry_run=False,
    )

    images = session.query(MasterProductImage).filter(MasterProductImage.sku == "PB-CH-TOUCH UP KIT").order_by(MasterProductImage.sort_order).all()
    assert result["updated"] == 1
    assert result["sample"][0]["base_sku"] == "ACH-TOUCH UP KIT"
    assert [row.file_name for row in images] == ["Touch Up Kit_Misc_TouchUpKit_Uni.png"]
    assert all(row.image_role != "vignette" for row in images)
    assert all(row.image_role != "sample_door" for row in images)


def test_sync_package_vignette_images_assigns_vignettes_only(catalog_intent_session):
    session = catalog_intent_session
    native = MasterProduct(
        sku="ACH-B12",
        name="Anna Base 12",
        collection="Anna Caramel Harvest",
        membership_mode="native",
        row_hash="ach-b12",
        is_active=True,
    )
    package = MasterProduct(
        sku="ACH-PKG-L810",
        name="Anna Caramel Harvest Package",
        collection="Anna Caramel Harvest",
        membership_mode="native",
        row_hash="ach-pkg-l810",
        is_active=True,
    )
    session.add_all([native, package])
    session.flush()
    session.add_all(
        [
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="AnnaCaramelHarvest_Vignette1a.jpg",
                image_url="https://cdn.example.com/ach-v1.jpg",
                image_role="vignette",
                sort_order=0,
            ),
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="AnnaCaramelHarvest_Vignette1b.jpg",
                image_url="https://cdn.example.com/ach-v1b.jpg",
                image_role="vignette",
                sort_order=1,
            ),
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="AnnaCaramelHarvest_Door.jpg",
                image_url="https://cdn.example.com/ach-door.jpg",
                image_role="sample_door",
                sort_order=2,
            ),
            MasterProductImage(
                product_id=native.id,
                sku=native.sku,
                file_name="B12_Base_1Door1Drawer_Uni.png",
                image_url="https://cdn.example.com/ach-diagram.png",
                image_role="diagram",
                sort_order=3,
            ),
        ]
    )
    session.flush()

    result = sync_package_vignette_images(
        session,
        skus=["ACH-PKG-L810"],
        dry_run=False,
    )

    images = session.query(MasterProductImage).filter(MasterProductImage.sku == "ACH-PKG-L810").order_by(MasterProductImage.sort_order).all()
    assert result["updated"] == 1
    assert [row.file_name for row in images] == [
        "AnnaCaramelHarvest_Vignette1a.jpg",
        "AnnaCaramelHarvest_Vignette1b.jpg",
    ]
    assert all(row.image_role == "vignette" for row in images)
