from db.tribeca_sku_parse import (
    apply_channel_prefix_reverse,
    expand_legacy_modifier_reference_keys,
    expand_upload_reference_to_master_keys,
    image_filename_item_sku,
    infer_tb_standard_line_prefix,
    master_sku_matches_tribeca_image_key,
    parse_image_item_code,
    parse_master_raw_sku,
    parse_sku,
    split_styled_sku,
)
from db.channel_sku_prefix_mapping import default_shopify_prefix_rule_pairs

def test_parse_sku_from_build_plytix_csv():
    assert parse_sku("BBC42") == ("BBC", 42, "")
    assert parse_sku("BBC39/42L/R") == ("BBC", 39, "/42L/R")
    assert parse_sku("B15") == ("B", 15, "")
    assert parse_sku("BEC1124L") == ("BEC", 11, "24L")


def test_parse_master_raw_sku():
    parsed = parse_master_raw_sku("BBC39/42L/R")
    assert parsed == {
        "type_code": "BBC",
        "low": 39,
        "high": 42,
        "variant": "L",
        "rest": "R",
    }
    parsed = parse_master_raw_sku("BBC45/48FHL/R-MC")
    assert parsed["type_code"] == "BBC"
    assert parsed["high"] == 48
    assert parsed["variant"] == "FHL"
    assert parsed["rest"] == "R-MC"
    parsed = parse_master_raw_sku("BEC1120/1124L/R")
    assert parsed == {
        "type_code": "BEC",
        "low": 1120,
        "high": 1124,
        "variant": "L",
        "rest": "R",
    }
    parsed = parse_master_raw_sku("FPP96/48/R")
    assert parsed["type_code"] == "FPP"
    assert parsed["low"] == 96
    assert parsed["high"] == 48
    assert parsed["rest"] == "R"


def test_parse_image_item_code_long_widths():
    from db.tribeca_sku_parse import tribeca_image_matches_master

    bec = parse_image_item_code("BEC1124L")
    assert bec == {
        "type_code": "BEC",
        "width": 1124,
        "extra_widths": [],
        "remainder": "L",
        "tag": "",
    }
    bec_r = parse_image_item_code("BEC1124R")
    assert bec_r["remainder"] == "R"
    fpp = parse_image_item_code("FPP9648")
    assert fpp["width"] == 96
    assert fpp["extra_widths"] == [48]
    bbc = parse_image_item_code("BBC3639LR")
    assert bbc["width"] == 36
    assert bbc["extra_widths"] == [39]
    dwr = parse_image_item_code("DWR3L")
    assert dwr["width"] == 3
    assert dwr["remainder"] == "L"

    master_bec = parse_master_raw_sku("BEC1120/1124L/R")
    master_fpp = parse_master_raw_sku("FPP96/48/R")
    master_dwr = parse_master_raw_sku("DWR2/3L/R")
    assert tribeca_image_matches_master(bec, master_bec) is True
    assert tribeca_image_matches_master(bec_r, master_bec) is True
    assert tribeca_image_matches_master(fpp, master_fpp) is True
    assert tribeca_image_matches_master(dwr, master_dwr) is True


def test_channel_prefix_reverse_to_master():
    rules = default_shopify_prefix_rule_pairs()
    assert apply_channel_prefix_reverse("HD-CW-B15", rules) == "HPW-B15"
    assert apply_channel_prefix_reverse("RTA-HD-CW123", rules) == "RTA-HPW123"
    assert "HPW-B15" in expand_upload_reference_to_master_keys("HD-CW-B15", channel_prefix_rules=rules)
    assert "RTA-HPW123" in expand_upload_reference_to_master_keys("RTA-HD-CW123", channel_prefix_rules=rules)
    assert expand_legacy_modifier_reference_keys("ASM-CH-WSC1818") == ["ACH-WSC1818"]
    assert expand_legacy_modifier_reference_keys("ASM-BRO-MC3018") == ["MBRO-MC3018"]
    assert expand_legacy_modifier_reference_keys("DNU-ASG-GD-W1530") == ["ASG-GD-W1530"]
    assert "ACH-WSC1818" in expand_upload_reference_to_master_keys("ASM-CH-WSC1818", channel_prefix_rules=rules)
    assert "ASG-GD-W1530" in expand_upload_reference_to_master_keys("DNU-ASG-GD-W1530", channel_prefix_rules=rules)


def test_image_render_prefix_to_master_style():
    from db.tribeca_sku_parse import expand_image_key_master_styles, master_style_codes_for_image_prefix

    assert master_style_codes_for_image_prefix("CW") == ["HPW"]
    assert master_style_codes_for_image_prefix("ASW") == ["ASW"]
    assert master_style_codes_for_image_prefix("SNW") == []
    assert infer_tb_standard_line_prefix("TB-Standard Line-HD(CA)-CA-B15-CLOSE.png") == "HD-CA"
    assert infer_tb_standard_line_prefix("TB-Standard Line-HD(WRO)-WRO-B15-CLOSE.png") == "HD-WRO"
    assert infer_tb_standard_line_prefix("TB-Standard Line-SOHO(EB)-EB-B15-CLOSE.png") == "SH-EB"
    assert infer_tb_standard_line_prefix("TB-Standard Line-SOHO(SNW)-SNW-B15-CLOSE.png") == "SH-SNW"
    assert infer_tb_standard_line_prefix("TB-Standard Line-Southampton(SNW)-SNW-B15-CLOSE.png") == "STH-SNW"
    assert infer_tb_standard_line_prefix("TB-Standard Line-Southampton(WRO)-WRO-B15-CLOSE.png") == "STH-WRO"
    assert infer_tb_standard_line_prefix("TB-Standard Line-Southampton(CBO)-CBO-B15-CLOSE.png") == "STH-CBO"
    assert master_style_codes_for_image_prefix("SNW", context="STH-SNW-B15") == ["MSW"]
    assert master_style_codes_for_image_prefix("SNW", context="TB-Standard Line-SOHO(SNW)-SNW-B15") == ["ESW"]
    assert master_style_codes_for_image_prefix("CA", context="TB-Standard Line-HD(CA)-CA-B15") == ["ACH"]
    assert master_style_codes_for_image_prefix("WRO", context="TB-Standard Line-HD(WRO)-WRO-B15") == ["ANRO"]
    assert master_style_codes_for_image_prefix("WRO", context="TB-Standard Line-Southampton(WRO)-WRO-B15") == ["MNRO"]
    assert master_style_codes_for_image_prefix("EB", context="TB-Standard Line-SOHO(EB)-EB-B15") == ["EOB"]
    assert "HPW-B15" in expand_image_key_master_styles("CW-B15")
    assert expand_image_key_master_styles("SNW-B15") == ["SNW-B15"]
    assert expand_image_key_master_styles("STH-SNW-B15") == ["STH-SNW-B15"]


def test_tribeca_image_key_matching():
    assert master_sku_matches_tribeca_image_key("ASW-BBC39/42L/R", "ASW-BBC42") is True
    assert master_sku_matches_tribeca_image_key("HPW-B15", "CW-B15") is True
    assert master_sku_matches_tribeca_image_key("ASW-BBC45/48L/R", "ASW-BBC45") is True
    assert master_sku_matches_tribeca_image_key("ASW-BBC45/48FHL/R", "ASW-BBC45FHL") is True
    assert master_sku_matches_tribeca_image_key("ASW-BBC45/48FHL/R-MC", "ASW-BBC45FHL-MC") is True
    assert master_sku_matches_tribeca_image_key("ASW-BBC45/48FHL/R", "ASW-BBC45") is False
    assert master_sku_matches_tribeca_image_key("ASW-BEC1120/1124L/R", "ASW-BEC1124L") is True
    assert master_sku_matches_tribeca_image_key("ASW-BEC1120/1124L/R", "ASW-BEC1124R") is True
    assert master_sku_matches_tribeca_image_key("ASW-FPP96/48/R", "ASW-FPP9648") is True
    assert master_sku_matches_tribeca_image_key("ASW-DWR2/3L/R", "ASW-DWR3L") is True
    assert master_sku_matches_tribeca_image_key("ASG-BCOR33L/R", "ASG-BCOR33LR") is True
    assert master_sku_matches_tribeca_image_key("ASG-BCOR36L/R", "ASG-BCOR36LR") is True
    assert master_sku_matches_tribeca_image_key("ASG-BEC1224L", "ASG-BEC1124L") is False


def test_resolve_skus_render_prefix():
    from db.master_product_images import resolve_skus_from_row

    known = {"HPW-B15", "HPW-B18", "HPW-BEC1224L"}
    assert resolve_skus_from_row({"name": "CW-B15-CLOSED.png"}, known_skus=known)[0] == ["HPW-B15"]
    assert resolve_skus_from_row({"name": "HPW-B15-CLOSED.png"}, known_skus=known)[0] == ["HPW-B15"]
    assert resolve_skus_from_row({"name": "CW-BEC1124L-CLOSED.png"}, known_skus=known)[0] == ["HPW-BEC1224L"]


def test_match_master_skus_for_catalog_image_item():
    from db.tribeca_sku_parse import match_master_skus_for_catalog_image_item

    known = {
        "ACH-BEC1224L",
        "ACH-DWR3L/R",
        "ACH-FPP9648 1/4",
        "ACH-FPP9648 3/4",
    }
    assert match_master_skus_for_catalog_image_item("ACH-BEC1124L", known) == ["ACH-BEC1224L"]
    assert match_master_skus_for_catalog_image_item("ACH-DWR3L", known) == ["ACH-DWR3L/R"]
    assert sorted(match_master_skus_for_catalog_image_item("ACH-FPP9648", known)) == [
        "ACH-FPP9648 1/4",
        "ACH-FPP9648 3/4",
    ]


def test_resolve_skus_channel_prefix_reverse():
    from db.master_product_images import resolve_skus_from_row

    known = {"HPW-B15", "ASW-BBC39/42L/R"}
    assert resolve_skus_from_row({"name": "HD-CW-B15-CLOSED.png"}, known_skus=known)[0] == ["HPW-B15"]


def test_image_filename_item_sku():
    assert image_filename_item_sku("ASW-BBC42-CLOSED") == ("ASW", "BBC42")
    assert split_styled_sku("ASW-BBC42")[1] == "BBC42"
