from db.channel_sku_mapping import match_remote_sku_to_master
from db.channel_sku_prefix_mapping import _dedupe_longest_first, DEFAULT_SHOPIFY_PREFIX_RULES


def _indexes(*, masters: list[str], source_items: dict[str, str] | None = None):
    source_items = source_items or {}
    normalized = {}
    for master in masters:
        token = "".join(ch for ch in master.lower() if ch.isalnum())
        if token and token not in normalized:
            normalized[token] = master
    return {
        "master_skus": set(masters),
        "source_item_to_master": source_items,
        "normalized_to_master": normalized,
    }


def test_match_remote_exact_master_sku():
    indexes = _indexes(masters=["ABC123", "HPW-100"])
    master, source = match_remote_sku_to_master("HPW-100", indexes=indexes)
    assert master == "HPW-100"
    assert source == "remote_exact_master_sku"


def test_match_remote_prefix_reverse():
    rules = _dedupe_longest_first([(r["master_prefix"], r["channel_prefix"]) for r in DEFAULT_SHOPIFY_PREFIX_RULES])
    indexes = _indexes(masters=["HPW-999"])
    master, source = match_remote_sku_to_master("HD-CW-999", indexes=indexes, prefix_rules=rules)
    assert master == "HPW-999"
    assert source == "remote_prefix_reverse"


def test_match_remote_source_item():
    indexes = _indexes(masters=["NEW-SKU"], source_items={"LEGACY-1": "NEW-SKU"})
    master, source = match_remote_sku_to_master("LEGACY-1", indexes=indexes)
    assert master == "NEW-SKU"
    assert source == "remote_source_item"


def test_match_remote_no_master():
    indexes = _indexes(masters=["ABC123"])
    master, source = match_remote_sku_to_master("UNKNOWN-999", indexes=indexes)
    assert master is None
    assert source is None
