from db.master_product_images import (
    build_image_canonical_fields,
    derive_image_role,
    extract_image_match_candidates,
    extract_sku_prefix_from_image_name,
    extract_view_suffix,
    image_fields_by_sku,
    import_master_product_images_dataframe,
    import_photo_assets_dataframe,
    is_images_only_csv,
    master_sku_matches_image_prefix,
    master_sku_matches_slash_range_image_code,
    match_master_skus_for_image_prefix,
    match_master_skus_for_slash_range_image,
    resolve_skus_from_row,
)
import pandas as pd
from db.models import ChannelSkuPrefixMapping, MasterProduct, MasterProductImage


def test_extract_sku_prefix_from_image_name():
    assert extract_sku_prefix_from_image_name("CA-B15-CLOSE.png") == "CA-B15"
    assert extract_sku_prefix_from_image_name("CA-B15-OPEN.png") == "CA-B15"
    assert extract_sku_prefix_from_image_name("ASW-B33-CLOSED.png") == "ASW-B33"
    assert extract_sku_prefix_from_image_name("TB-Standard Line-HD(CA)/CA-B15-CLOSE.png") == "CA-B15"
    assert extract_sku_prefix_from_image_name("Finished Render Models-ASW-B15-CLOSE.png") == "ASW-B15"
    assert extract_sku_prefix_from_image_name("Finished Render Models-ASW-BBC45FHL-MC-OPEN.png") == "ASW-BBC45FHL-MC"


def test_master_sku_prefix_matching():
    known = {"CA-B15", "CA-B15-24", "CA-B15XXXX", "CA-B150", "HD-CW-01"}
    assert master_sku_matches_image_prefix("CA-B15XXXX", "CA-B15") is True
    assert master_sku_matches_image_prefix("CA-B15", "CA-B15") is True
    assert master_sku_matches_image_prefix("CA-B15-24", "CA-B15") is True
    assert master_sku_matches_image_prefix("CA-B150", "CA-B15") is False
    matches = match_master_skus_for_image_prefix("CA-B15", known)
    assert matches == ["CA-B15", "CA-B15-24", "CA-B15XXXX"]


def test_extract_view_suffix():
    assert extract_view_suffix("CA-B15-CLOSE.png") == "close"
    assert extract_view_suffix("CA-B15-OPEN.png") == "open"
    assert extract_view_suffix("ASW-B33-CLOSED.png") == "closed"


def test_extract_image_match_candidates():
    assert extract_image_match_candidates("ASW-B33-CLOSED.png") == ["ASW-B33-CLOSED", "ASW-B33"]
    assert extract_image_match_candidates("ASW-BBC42-OPEN.png") == ["ASW-BBC42-OPEN", "ASW-BBC42"]
    assert extract_image_match_candidates("CA-B15XXXX-CLOSE.png") == ["CA-B15XXXX-CLOSE", "CA-B15XXXX"]
    assert extract_image_match_candidates("Finished Render Models-CA-B15-CLOSE.png") == [
        "CA-B15-CLOSE",
        "CA-B15",
    ]


def test_finished_render_models_prefix_maps_to_master_catalog():
    known = {
        "ACH-B15",
        "ACH-B33",
        "ACH-BBC42",
        "ACH-BEC1224L",
        "ACH-BEC1224R",
        "MBRO-B15",
        "MBRO-BBC42",
        "EOB-B15",
        "ANRO-B15",
        "MNRO-B15",
        "ASW-B15",
        "ESW-B15",
        "MSW-B15",
        "GSW-B15",
    }
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-CA-B15-CLOSE.png"},
        known_skus=known,
    )[0] == ["ACH-B15"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-CA-B33-CLOSED.png"},
        known_skus=known,
    )[0] == ["ACH-B33"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-CA-BBC42-CLOSED.png"},
        known_skus=known,
    )[0] == ["ACH-BBC42"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-CA-BEC1124L-CLOSED.png"},
        known_skus=known,
    )[0] == ["ACH-BEC1224L"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-CBO-B15-CLOSE.png"},
        known_skus=known,
    )[0] == ["MBRO-B15"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-CBO-BBC42-CLOSED.png"},
        known_skus=known,
    )[0] == ["MBRO-BBC42"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-EB-B15-CLOSE.png"},
        known_skus=known,
    )[0] == ["EOB-B15"]
    matches, _ = resolve_skus_from_row(
        {"name": "Finished Render Models-WRO-B15-CLOSE.png"},
        known_skus=known,
    )
    assert matches == ["ANRO-B15"]
    matches, _ = resolve_skus_from_row(
        {"name": "TB-Standard Line-Southampton(WRO)-WRO-B15-CLOSE.png"},
        known_skus=known,
    )
    assert matches == ["MNRO-B15"]
    matches, _ = resolve_skus_from_row(
        {"name": "TB-Standard Line-HD(WRO)-WRO-B15-CLOSE.png"},
        known_skus=known,
    )
    assert matches == ["ANRO-B15"]
    matches, _ = resolve_skus_from_row(
        {"name": "TB-Standard Line-SOHO(EB)-EB-B15-CLOSE.png"},
        known_skus=known,
    )
    assert matches == ["EOB-B15"]
    matches, _ = resolve_skus_from_row(
        {"name": "Finished Render Models-TB-Standard Line-Southampton(SNW)-SNW-B15-CLOSE.png"},
        known_skus=known,
    )
    assert matches == ["MSW-B15"]


def test_resolve_maya_snow_white_snw_renders_and_vignettes():
    known = {
        "MSW-B15",
        "MSW-B33",
        "MSW-BBC39/42L/R",
        "RTA-MSW-B15",
        "RTA-MSW-B33",
        "ASW-B15",
        "ESW-B15",
        "GSW-B15",
    }
    assert resolve_skus_from_row({"name": "SNW-B15-CLOSE.png"}, known_skus=known)[0] == []
    assert resolve_skus_from_row(
        {"name": "STH-SNW-B15-CLOSE.png"},
        known_skus=known,
    )[0] == [
        "MSW-B15",
        "RTA-MSW-B15",
    ]
    assert resolve_skus_from_row(
        {"name": "TB-Standard Line-Southampton(SNW)-SNW-B33-CLOSED.png"},
        known_skus=known,
    )[0] == [
        "MSW-B33",
        "RTA-MSW-B33",
    ]
    assert resolve_skus_from_row({"name": "STH-SNW-B15-CLOSE.png"}, known_skus=known)[0] == [
        "MSW-B15",
        "RTA-MSW-B15",
    ]
    matches, _ = resolve_skus_from_row({"name": "MayaSnowWhite_Vignette1a.jpg"}, known_skus=known)
    assert matches == ["MSW-B15", "MSW-B33", "MSW-BBC39/42L/R"]
    assert "ASW-B15" not in matches


def test_resolve_uses_url_and_key_context_for_bare_snw_manifest_rows():
    known = {"MSW-FPP9648 1/4", "MSW-FPP9648 3/4", "RTA-MSW-FPP9648 1/4", "RTA-MSW-FPP9648 3/4"}
    matches, _ = resolve_skus_from_row(
        {
            "name": "SNW-FPP9648.png",
            "url": "https://pub-3aedd5936a7e4bea95f3267214a86554.r2.dev/hs-images/TB-Standard Line-Southampton(SNW)/SNW-FPP9648.png",
            "key": "hs-images/TB-Standard Line-Southampton(SNW)/SNW-FPP9648.png",
        },
        known_skus=known,
    )
    assert sorted(matches) == sorted([
        "MSW-FPP9648 1/4",
        "RTA-MSW-FPP9648 1/4",
        "MSW-FPP9648 3/4",
        "RTA-MSW-FPP9648 3/4",
    ])

    known_ranges = {
        "MSW-BBC39/42L/R",
        "RTA-MSW-BBC39/42L/R",
        "MSW-BBC45/48L/R",
        "RTA-MSW-BBC45/48L/R",
        "MSW-BBC45/48FHL/R",
        "RTA-MSW-BBC45/48FHL/R",
        "MSW-BBC45/48FHL/R-MC",
        "RTA-MSW-BBC45/48FHL/R-MC",
        "MSW-BCOR36L/R",
        "RTA-MSW-BCOR36L/R",
        "MSW-M2436",
        "RTA-MSW-M2436",
    }
    path = "hs-images/TB-Standard Line-Southampton(SNW)/"
    assert resolve_skus_from_row(
        {"name": "SNW-BBC42-CLOSED.png", "key": f"{path}SNW-BBC42-CLOSED.png"},
        known_skus=known_ranges,
    )[0] == ["MSW-BBC39/42L/R", "RTA-MSW-BBC39/42L/R"]
    assert resolve_skus_from_row(
        {"name": "SNW-BBC45-CLOSED.png", "key": f"{path}SNW-BBC45-CLOSED.png"},
        known_skus=known_ranges,
    )[0] == ["MSW-BBC45/48L/R", "RTA-MSW-BBC45/48L/R"]
    assert resolve_skus_from_row(
        {"name": "SNW-BBC45FHL-MC-CLOSED.png", "key": f"{path}SNW-BBC45FHL-MC-CLOSED.png"},
        known_skus=known_ranges,
    )[0] == ["MSW-BBC45/48FHL/R-MC", "RTA-MSW-BBC45/48FHL/R-MC"]
    assert resolve_skus_from_row(
        {"name": "SNW-BCOR36-CLOSED.png", "key": f"{path}SNW-BCOR36-CLOSED.png"},
        known_skus=known_ranges,
    )[0] == ["MSW-BCOR36L/R", "RTA-MSW-BCOR36L/R"]
    assert resolve_skus_from_row(
        {"name": "SNW-M2436.png", "key": f"{path}SNW-M2436.png"},
        known_skus=known_ranges,
    )[0] == ["MSW-M2436", "RTA-MSW-M2436"]


def test_resolve_legacy_assembled_and_dnu_prefixes_to_canonical_master_skus():
    known = {
        "ACH-WSC1818",
        "MBRO-MC3018",
        "ANRO-WSC1818",
        "EOB-MC3018",
        "HPW-WSC1818",
        "ASG-MC3018",
        "ASW-WSC1818",
        "ASG-GD-W1530",
    }
    assert resolve_skus_from_row({"name": "ASM-CH-WSC1818.png"}, known_skus=known)[0] == ["ACH-WSC1818"]
    assert resolve_skus_from_row({"name": "ASM-BRO-MC3018.png"}, known_skus=known)[0] == ["MBRO-MC3018"]
    assert resolve_skus_from_row({"name": "ASM-NRO-WSC1818.png"}, known_skus=known)[0] == ["ANRO-WSC1818"]
    assert resolve_skus_from_row({"name": "ASM-OB-MC3018.png"}, known_skus=known)[0] == ["EOB-MC3018"]
    assert resolve_skus_from_row({"name": "ASM-PW-WSC1818.png"}, known_skus=known)[0] == ["HPW-WSC1818"]
    assert resolve_skus_from_row({"name": "ASM-SG-MC3018.png"}, known_skus=known)[0] == ["ASG-MC3018"]
    assert resolve_skus_from_row({"name": "ASM-SW-WSC1818.png"}, known_skus=known)[0] == ["ASW-WSC1818"]
    assert resolve_skus_from_row({"name": "DNU-ASG-GD-W1530.png"}, known_skus=known)[0] == ["ASG-GD-W1530"]


def test_resolve_soho_snw_renders_to_eleanor_snow_white():
    known = {"ESW-B15", "RTA-ESW-B15", "MSW-B15"}
    assert resolve_skus_from_row(
        {"name": "TB-Standard Line-SOHO(SNW)-SNW-B15-CLOSE.png"},
        known_skus=known,
    )[0] == ["ESW-B15", "RTA-ESW-B15"]


def test_resolve_skus_exact_and_prefix():
    known = {
        "ASW-B33",
        "ASW-B33-CLOSED",
        "CA-B15",
        "CA-B15XXXX",
    }
    assert resolve_skus_from_row({"name": "ASW-B33-CLOSED.png"}, known_skus=known)[0] == ["ASW-B33-CLOSED"]
    assert resolve_skus_from_row({"name": "CA-B15-CLOSE.png"}, known_skus=known)[0] == [
        "CA-B15",
        "CA-B15XXXX",
    ]
    assert resolve_skus_from_row({"name": "CA-B15XXXX-CLOSE.png"}, known_skus=known)[0] == ["CA-B15XXXX"]
    assert resolve_skus_from_row({"name": "MISSING-SKU-CLOSED.png"}, known_skus=known)[0] == []


def test_slash_range_image_matching():
    known = {
        "ASW-BBC39/42L/R",
        "ASW-BBC45/48L/R",
        "ASW-BBC45/48FHL/R",
        "ASW-BBC45/48FHL/R-MC",
        "ASW-BBC36/39L/R",
    }
    assert master_sku_matches_slash_range_image_code("ASW-BBC39/42L/R", "ASW-BBC42") is True
    assert master_sku_matches_slash_range_image_code("ASW-BBC45/48L/R", "ASW-BBC45") is True
    assert master_sku_matches_slash_range_image_code("ASW-BBC45/48FHL/R", "ASW-BBC45") is False
    assert master_sku_matches_slash_range_image_code("ASW-BBC45/48FHL/R", "ASW-BBC45FHL") is True
    assert master_sku_matches_slash_range_image_code("ASW-BBC45/48FHL/R-MC", "ASW-BBC45FHL-MC") is True
    assert master_sku_matches_slash_range_image_code("ASW-BBC45/48FHL/R", "ASW-BBC45FHL-MC") is False

    assert resolve_skus_from_row({"name": "ASW-BBC42-CLOSED.png"}, known_skus=known)[0] == ["ASW-BBC39/42L/R"]
    assert resolve_skus_from_row({"name": "ASW-BBC42-OPEN.png"}, known_skus=known)[0] == ["ASW-BBC39/42L/R"]
    assert resolve_skus_from_row({"name": "ASW-BBC45-CLOSED.png"}, known_skus=known)[0] == ["ASW-BBC45/48L/R"]
    assert resolve_skus_from_row({"name": "ASW-BBC45-OPEN.png"}, known_skus=known)[0] == ["ASW-BBC45/48L/R"]
    assert resolve_skus_from_row({"name": "ASW-BBC45FHL-CLOSED.png"}, known_skus=known)[0] == ["ASW-BBC45/48FHL/R"]
    assert resolve_skus_from_row({"name": "ASW-BBC45FHL-MC-CLOSED.png"}, known_skus=known)[0] == [
        "ASW-BBC45/48FHL/R-MC"
    ]
    assert match_master_skus_for_slash_range_image("ASW-BBC36", known) == ["ASW-BBC36/39L/R"]


def test_slash_range_image_matching_other_families():
    known = {
        "ASW-BCOR36/39L/R",
        "ASW-BWB18/21L/R",
        "ASW-BEC1120/1124L/R",
        "ASW-BPP08/09L/R",
        "ASW-BH15/18FHL/R",
        "ASW-BH15/18FHL/R-MC",
    }
    assert resolve_skus_from_row({"name": "ASW-BCOR36-CLOSED.png"}, known_skus=known)[0] == ["ASW-BCOR36/39L/R"]
    assert resolve_skus_from_row({"name": "ASW-BWB18-OPEN.png"}, known_skus=known)[0] == ["ASW-BWB18/21L/R"]
    assert resolve_skus_from_row({"name": "ASW-BEC1124L-CLOSED.png"}, known_skus=known)[0] == ["ASW-BEC1120/1124L/R"]
    assert resolve_skus_from_row({"name": "ASW-BPP09-CLOSED.png"}, known_skus=known)[0] == ["ASW-BPP08/09L/R"]
    assert resolve_skus_from_row({"name": "ASW-BH18FHL-CLOSED.png"}, known_skus=known)[0] == ["ASW-BH15/18FHL/R"]
    assert resolve_skus_from_row({"name": "ASW-BH18FHL-MC-OPEN.png"}, known_skus=known)[0] == ["ASW-BH15/18FHL/R-MC"]


def test_resolve_skus_fpp_dwr_bec_hands():
    known = {
        "ASG-BEC1224L",
        "ASG-BEC1224R",
        "ASG-FPP9648 1/4",
        "ASG-FPP9648 3/4",
        "ASG-FPPB9648 1/2",
        "ASG-DWR3L/R",
        "HPW-BEC1224L",
    }
    assert resolve_skus_from_row({"name": "ASW-BEC1124L-CLOSED.png"}, known_skus=known)[0] == []
    assert resolve_skus_from_row({"name": "ASG-BEC1124L-CLOSED.png"}, known_skus=known)[0] == ["ASG-BEC1224L"]
    assert resolve_skus_from_row({"name": "ASG-BEC1124R-OPEN.png"}, known_skus=known)[0] == ["ASG-BEC1224R"]
    assert sorted(resolve_skus_from_row({"name": "ASG-FPP9648.png"}, known_skus=known)[0]) == [
        "ASG-FPP9648 1/4",
        "ASG-FPP9648 3/4",
        "ASG-FPPB9648 1/2",
    ]
    assert resolve_skus_from_row({"name": "ASG-DWR3L.png"}, known_skus=known)[0] == ["ASG-DWR3L/R"]
    assert resolve_skus_from_row({"name": "CW-BEC1124L-CLOSED.png"}, known_skus=known)[0] == ["HPW-BEC1224L"]


def test_resolve_collection_vignette_assets():
    known = {
        "ASW-B15",
        "ASW-BBC39/42L/R",
        "HPW-B15",
        "ACH-B12",
    }
    matches, _ = resolve_skus_from_row({"name": "AnnaSnowWhite_Vignette1a.jpg"}, known_skus=known)
    assert matches == ["ASW-B15", "ASW-BBC39/42L/R"]
    matches, _ = resolve_skus_from_row({"name": "AnnaSnowWhiteVignette1a.jpg"}, known_skus=known)
    assert matches == ["ASW-B15", "ASW-BBC39/42L/R"]
    matches, _ = resolve_skus_from_row({"name": "AnnaCaramelHarvest_Door.jpg"}, known_skus=known)
    assert matches == ["ACH-B12"]
    matches, _ = resolve_skus_from_row({"name": "AnnaNaturalRiftWhiteOak_Vignette2.jpg"}, known_skus=known)
    assert matches == []


def test_resolve_skus_includes_rta_mirrors():
    known = {
        "ASW-BBC39/42L/R",
        "ASW-B15",
        "RTA-ASW-BBC39/42L/R",
        "RTA-ASW-B15",
        "ACH-B12",
        "RTA-ACH-B12",
        "HPW-B15",
        "RTA-HPW-B15",
    }
    matches, _ = resolve_skus_from_row({"name": "ASW-BBC42-CLOSED.png"}, known_skus=known)
    assert matches == ["ASW-BBC39/42L/R", "RTA-ASW-BBC39/42L/R"]
    matches, _ = resolve_skus_from_row({"name": "CW-B15-CLOSE.png"}, known_skus=known)
    assert matches == ["HPW-B15", "RTA-HPW-B15"]
    matches, _ = resolve_skus_from_row({"name": "AnnaCaramelHarvest_Vignette1a.jpg"}, known_skus=known)
    assert matches == ["ACH-B12"]
    matches, _ = resolve_skus_from_row({"name": "AnnaSnowWhite_Vignette1a.jpg"}, known_skus=known)
    assert matches == ["ASW-B15", "ASW-BBC39/42L/R"]


def test_resolve_collection_vignette_assets_rta_only_catalog():
    known = {
        "RTA-ASW-B15",
        "RTA-ASW-BBC39/42L/R",
    }
    matches, _ = resolve_skus_from_row({"name": "AnnaSnowWhite_Vignette1a.jpg"}, known_skus=known)
    assert matches == []


def test_resolve_collection_vignette_by_master_collection_name():
    known = {"HEM-B12", "HEM-B15", "ASW-B15"}
    collection_by_sku = {
        "HEM-B12": "Hurston Espresso Maple",
        "HEM-B15": "Hurston Espresso Maple",
        "ASW-B15": "Anna Snow White",
    }
    matches, _ = resolve_skus_from_row(
        {"name": "HurstonEspressoMaple_Vignette1a.jpg"},
        known_skus=known,
        collection_by_sku=collection_by_sku,
    )
    assert matches == ["HEM-B12", "HEM-B15"]


def test_resolve_collection_asset_falls_back_to_collection_name_when_style_prefix_has_no_matches():
    known = {"PB-HE-SD", "ASW-B15"}
    collection_by_sku = {
        "PB-HE-SD": "Hurston Midnight Espresso",
        "ASW-B15": "Anna Snow White",
    }
    matches, _ = resolve_skus_from_row(
        {"name": "HurstonEspressoMaple_Door.jpg"},
        known_skus=known,
        collection_by_sku=collection_by_sku,
    )
    assert matches == ["PB-HE-SD"]


def test_resolve_oven_double_diagram_assets():
    known = {"CSG-OVD3384", "RTA-CSG-OVD3384"}
    matches, _ = resolve_skus_from_row({"name": "OC3384D_Base_DoubleOven_NoBrand.png"}, known_skus=known)
    assert matches == ["CSG-OVD3384", "RTA-CSG-OVD3384"]
    matches, _ = resolve_skus_from_row(
        {"name": "MetroMist_Vignette2.jpg"},
        known_skus={"MM-B09"},
        collection_by_sku={"MM-B09": "Metro Mist"},
    )
    assert matches == ["MM-B09"]


def test_resolve_render_prefix_vanity_mirror_assets():
    known = {"MSW-M2436", "RTA-MSW-M2436"}
    matches, _ = resolve_skus_from_row({"name": "SNW-M2436.png"}, known_skus=known)
    assert matches == []
    matches, _ = resolve_skus_from_row(
        {"name": "TB-Standard Line-Southampton(SNW)-SNW-M2436.png"},
        known_skus=known,
    )
    assert matches == ["MSW-M2436", "RTA-MSW-M2436"]


def test_resolve_castlecraft_collection_vignette_assets():
    known = {
        "BDW-12B",
        "BDW-15B",
        "BTP-12W",
        "CGO-18BR",
        "CSG-B12",
        "FGH-B15",
        "ASW-B15",
    }
    matches, _ = resolve_skus_from_row({"name": "BelmontDriftWhite_Door.jpg"}, known_skus=known)
    assert matches == ["BDW-12B", "BDW-15B"]
    matches, _ = resolve_skus_from_row({"name": "BelmontToffeePecan_Vignette1a.jpg"}, known_skus=known)
    assert matches == ["BTP-12W"]
    matches, _ = resolve_skus_from_row({"name": "ChesapeakeGoldenOak_Vignette2.jpg"}, known_skus=known)
    assert matches == ["CGO-18BR"]
    matches, _ = resolve_skus_from_row({"name": "ChesapeakGoldenOak_Vignette1b.jpg"}, known_skus=known)
    assert matches == ["CGO-18BR"]
    matches, _ = resolve_skus_from_row({"name": "CooperSlateGray_Door.jpg"}, known_skus=known)
    assert matches == ["CSG-B12"]
    matches, _ = resolve_skus_from_row({"name": "GalaxyHorizon_Vignette1b.jpg"}, known_skus=known)
    assert matches == ["FGH-B15"]


def test_resolve_hallmark_frost_collection_vignette_assets():
    known = {
        "FHF-B09",
        "FHF-B12",
        "FGH-WF336",
    }
    matches, _ = resolve_skus_from_row({"name": "HallmarkFrost_Vignette1a.jpg"}, known_skus=known)
    assert matches == ["FHF-B09", "FHF-B12"]


def test_resolve_vsd_vanity_renders_cross_style():
    known = {
        "ACH-VSD3021DL",
        "ACH-VSD3621DL",
        "ASW-VSD3021DL",
        "ASW-VSD3621DL",
        "ASG-VSD3021DL",
        "ASG-VSD4821DLR",
        "HPW-B15",
    }
    matches, _ = resolve_skus_from_row({"name": "CW-VSD3036DL-CLOSED.png"}, known_skus=known)
    assert sorted(matches) == [
        "ACH-VSD3021DL",
        "ACH-VSD3621DL",
        "ASG-VSD3021DL",
        "ASW-VSD3021DL",
        "ASW-VSD3621DL",
    ]
    matches, _ = resolve_skus_from_row({"name": "CW-VSD3048DL-OPEN.png"}, known_skus=known)
    assert sorted(matches) == [
        "ACH-VSD3021DL",
        "ASG-VSD3021DL",
        "ASG-VSD4821DLR",
        "ASW-VSD3021DL",
    ]


def test_resolve_gd_w_glass_and_corner_renders():
    known = {
        "EOB-GD-W1515",
        "EOB-GDWCOR2415",
        "ASG-GD-W1515",
        "ASG-GDW1515",
        "ASG-WOC1815",
        "ASG-MWEP15",
    }
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-EB-GD-W1515.png"},
        known_skus=known,
    )[0] == ["EOB-GD-W1515"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-EB-GD-WCOR2415.png"},
        known_skus=known,
    )[0] == ["EOB-GDWCOR2415"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-HS-GD-W1515.png"},
        known_skus=known,
    )[0] == ["ASG-GD-W1515"]
    assert resolve_skus_from_row(
        {"name": "HS-GD-W1515.png"},
        known_skus={"ASG-GDW1515"},
    )[0] == ["ASG-GDW1515"]
    assert resolve_skus_from_row(
        {"name": "Finished Render Models-HS-GDW1515-CLOSED.png"},
        known_skus=known,
    )[0] == ["ASG-GDW1515"]


def test_resolve_fpp_diagram_fraction_hyphen():
    known = {
        "ACH-FPP9648 1/4",
        "ASG-FPP9648 3/4",
    }
    matches, _ = resolve_skus_from_row({"name": "FPP9648 1-4_Misc_Panels_Uni.png"}, known_skus=known)
    assert matches == ["ACH-FPP9648 1/4"]


def test_resolve_universal_diagrams():
    known = {
        "ASW-B12",
        "HPW-B12",
        "ASW-BBC36/39L/R",
        "HPW-BBC36/39L/R",
        "ACH-BCOR33L/R",
        "ASG-BCOR33L/R",
        "ACH-BCOR36L/R",
        "ASG-CSB36-FP",
        "HPW-CSB36-FP",
    }
    assert resolve_skus_from_row({"name": "B12_Base_1Door1Drawer_Uni.png"}, known_skus=known)[0] == [
        "ASW-B12",
        "HPW-B12",
    ]
    matches, _ = resolve_skus_from_row({"name": "BBC3639LR_Base_BlindCorner_Uni.png"}, known_skus=known)
    assert sorted(matches) == ["ASW-BBC36/39L/R", "HPW-BBC36/39L/R"]
    matches, _ = resolve_skus_from_row({"name": "BCOR33LR_Base_LazySusan_Uni.png"}, known_skus=known)
    assert sorted(matches) == ["ACH-BCOR33L/R", "ASG-BCOR33L/R"]
    matches, _ = resolve_skus_from_row({"name": "BCOR36LR_Base_LazySusan_Uni.png"}, known_skus=known)
    assert sorted(matches) == ["ACH-BCOR36L/R"]
    assert resolve_skus_from_row({"name": "CSB36-FP_Base_CornerSInkBase_Uni.png"}, known_skus=known)[0] == [
        "ASG-CSB36-FP",
        "HPW-CSB36-FP",
    ]


def test_resolve_rollout_tray_universal_diagrams():
    known = {
        "BTP-15BT",
        "CGO-18BT",
        "RTA-CGO-18BT",
    }
    assert resolve_skus_from_row({"name": "ROTD-15_Misc_RolloutTray_Uni.png"}, known_skus=known)[0] == [
        "BTP-15BT",
    ]
    assert resolve_skus_from_row({"name": "ROTD-18_Misc_RolloutTray_Uni.png"}, known_skus=known)[0] == [
        "CGO-18BT",
        "RTA-CGO-18BT",
    ]


def test_dedupe_image_rows():
    from db.master_product_images import _dedupe_image_rows

    rows = [
        {"product_id": 1, "sku": "MSW-WSC1818", "file_name": "SNW-WSC1818.png", "image_url": "https://a/1"},
        {"product_id": 1, "sku": "MSW-WSC1818", "file_name": "SNW-WSC1818.png", "image_url": "https://a/2"},
        {"product_id": 2, "sku": "ASW-B15", "file_name": "ASW-B15-CLOSE.png", "image_url": "https://a/3"},
    ]
    deduped, removed = _dedupe_image_rows(rows)
    assert removed == 1
    assert len(deduped) == 2
    assert deduped[0]["image_url"] == "https://a/2"


def test_build_image_canonical_fields():
    fields = build_image_canonical_fields(
        [
            "https://cdn.example/close.png",
            "https://cdn.example/open.png",
        ]
    )
    assert fields["base_image"] == "https://cdn.example/close.png"
    assert fields["additional_images"] == "https://cdn.example/open.png"
    assert "image_urls" in fields


def test_build_image_canonical_fields_from_rows_sku_before_vignettes():
    """Stale sort_order with vignettes at 0 must not win over SKU/diagram assets."""
    from types import SimpleNamespace

    from db.master_product_images import build_image_canonical_fields_from_rows

    images = [
        SimpleNamespace(
            sku="ANRO-WCOR-PARENT",
            file_name="Anna_Vignette1a.jpg",
            image_url="https://cdn.example/vignette1.jpg",
            image_role="vignette",
            view_suffix="",
            sort_order=0,
        ),
        SimpleNamespace(
            sku="ANRO-WCOR-PARENT",
            file_name="Anna_Vignette2a.jpg",
            image_url="https://cdn.example/vignette2.jpg",
            image_role="vignette",
            view_suffix="",
            sort_order=1,
        ),
        SimpleNamespace(
            sku="ANRO-WCOR-PARENT",
            file_name="ANRO-WCOR-CLOSE.png",
            image_url="https://cdn.example/sku-close.png",
            image_role="closed",
            view_suffix="close",
            sort_order=5,
        ),
        SimpleNamespace(
            sku="ANRO-WCOR-PARENT",
            file_name="WCOR_Corner_Uni.png",
            image_url="https://cdn.example/diagram.png",
            image_role="diagram",
            view_suffix="",
            sort_order=6,
        ),
    ]
    fields = build_image_canonical_fields_from_rows(images)
    assert fields["base_image"] == "https://cdn.example/sku-close.png"
    assert "vignette1" in fields["additional_images"]
    assert fields["image_urls"].startswith("https://cdn.example/sku-close.png")


def test_build_image_canonical_fields_dedupes_repeated_urls():
    fields = build_image_canonical_fields(
        [
            "https://cdn.example/close.png",
            "https://cdn.example/close.png",
            "https://cdn.example/open.png",
            "https://cdn.example/open.png",
        ]
    )
    assert fields["base_image"] == "https://cdn.example/close.png"
    assert fields["additional_images"] == "https://cdn.example/open.png"
    assert fields["image_urls"] == "https://cdn.example/close.png,https://cdn.example/open.png"


def test_derive_image_role():
    assert derive_image_role(sku="ACH-B12", file_name="ACH-B12-CLOSE.png") == "closed"
    assert derive_image_role(sku="ACH-B12", file_name="ACH-B12-OPEN.png") == "open"
    assert derive_image_role(sku="ACH-SD", file_name="AnnaCaramelHarvest_Door.jpg") == "sample_door"
    assert derive_image_role(sku="ACH-SDP34", file_name="ACH-SDP34 4X4.jpg") == "sample_swatch"
    assert derive_image_role(sku="ACH-B12", file_name="AnnaCaramelHarvest_Vignette1a.jpg") == "vignette"
    assert derive_image_role(sku="ACH-B12", file_name="B12_Base_1Door1Drawer_Uni.png") == "diagram"


def test_import_master_product_images_dataframe_returns_full_unmatched_list(catalog_intent_session):
    session = catalog_intent_session
    session.add(MasterProduct(sku="ACH-B12", name="Anna Base", row_hash="seed", is_active=True))
    session.commit()

    df = pd.DataFrame(
        [
            {"Name": "ACH-B12-CLOSE.png", "URL": "https://cdn.example/ACH-B12-CLOSE.png"},
            {"Name": "Unknown-1.png", "URL": "https://cdn.example/Unknown-1.png"},
            {"Name": "Unknown-2.png", "URL": "https://cdn.example/Unknown-2.png"},
        ]
    )

    stats = import_master_product_images_dataframe(session, df, source_label="test_images_csv")

    assert stats["unmatched_rows"] == 2
    assert stats["sample_unmatched"] == ["Unknown-1.png", "Unknown-2.png"]
    assert stats["all_unmatched"] == ["Unknown-1.png", "Unknown-2.png"]


def test_import_master_product_images_dataframe_uses_db_prefix_reverse_mapping(catalog_intent_session):
    session = catalog_intent_session
    session.add(MasterProduct(sku="HPW-B15", name="Harriet Base", row_hash="seed", is_active=True))
    session.add(
        ChannelSkuPrefixMapping(
            channel_code="shopify",
            connection_id=1000001,
            master_prefix="HPW",
            channel_prefix="HD-CW",
            mapping_status="active",
            sort_order=10,
            notes="test",
        )
    )
    session.commit()

    df = pd.DataFrame(
        [
            {"Name": "HD-CW-B15-CLOSE.png", "URL": "https://cdn.example/HD-CW-B15-CLOSE.png"},
        ]
    )

    stats = import_master_product_images_dataframe(session, df, source_label="test_images_csv")

    rows = session.query(MasterProductImage).filter(MasterProductImage.sku == "HPW-B15").all()
    assert stats["images_upserted"] == 1
    assert len(rows) == 1
    assert rows[0].file_name == "HD-CW-B15-CLOSE.png"


def test_import_photo_assets_merge_replaces_stale_collection_assets(catalog_intent_session):
    session = catalog_intent_session
    product = MasterProduct(sku="ACH-BPP09", name="Anna Pantry", row_hash="seed", is_active=True)
    session.add(product)
    session.flush()
    session.add_all(
        [
            MasterProductImage(
                product_id=product.id,
                sku=product.sku,
                file_name="ACH-BPP09-CLOSE.png",
                image_url="https://cdn.example/ACH-BPP09-CLOSE.png",
                source_label="seed",
                sort_order=0,
            ),
            MasterProductImage(
                product_id=product.id,
                sku=product.sku,
                file_name="AnnaSnowWhite_Vignette1a.jpg",
                image_url="https://cdn.example/AnnaSnowWhite_Vignette1a.jpg",
                source_label="seed",
                sort_order=1,
            ),
        ]
    )
    session.commit()

    df = pd.DataFrame(
        [
            {
                "SKU": "ACH-BPP09",
                "Collection_Vignette_Images": "https://cdn.example/AnnaCaramelHarvest_Vignette1a.jpg",
            }
        ]
    )
    stats = import_photo_assets_dataframe(session, df, source_label="photo_assets_csv")
    session.commit()

    fields = image_fields_by_sku(session, ["ACH-BPP09"])["ACH-BPP09"]
    rows = session.query(MasterProductImage).filter(MasterProductImage.sku == "ACH-BPP09").all()
    file_names = {row.file_name for row in rows}

    assert "ACH-BPP09-CLOSE.png" in file_names
    assert "AnnaCaramelHarvest_Vignette1a.jpg" in file_names
    assert "AnnaSnowWhite_Vignette1a.jpg" not in file_names
    assert fields["additional_images"] == "https://cdn.example/AnnaCaramelHarvest_Vignette1a.jpg"
    assert stats["merge_collection_rows_purged"] == 1


def test_is_images_only_csv():
    images_df = pd.DataFrame(
        [
            {"Name": "CA-B15-CLOSE.png", "URL": "https://cdn.example/close.png"},
            {"Name": "CA-B15-OPEN.png", "URL": "https://cdn.example/open.png"},
        ]
    )
    master_df = pd.DataFrame(
        [
            {"SKU": "CA-B15", "Display Name": "Cabinet", "Category": "Base"},
        ]
    )
    assert is_images_only_csv(images_df) is True
    assert is_images_only_csv(master_df) is False
