"""Tests for channel-aware variation axis resolution."""

from types import SimpleNamespace

import pytest

from db.channel_variation_axes import ChannelVariationAxisResolver


class _FakeSession:
    def execute(self, stmt):
        return []


def test_resolve_canonical_axis_uses_magento_defaults():
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    assert resolver.resolve_canonical_axis("variation_width_in") == "width"
    assert resolver.resolve_canonical_axis("variation_height_in") == "height"


def test_resolve_canonical_axis_uses_channel_alias(monkeypatch):
    session = _FakeSession()

    def fake_aliases(_session, channel_code, canonical_codes=None):
        return {
            "variation_width_in": [
                SimpleNamespace(channel_attribute_code="cabinet_width"),
            ]
        }

    import db.channel_aliases as alias_mod

    monkeypatch.setattr(alias_mod, "channel_aliases_by_canonical", fake_aliases)
    resolver = ChannelVariationAxisResolver(session, "magento")
    assert resolver.resolve_canonical_axis("variation_width_in") == "cabinet_width"


def test_map_option_mapping_rewrites_keys():
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    mapped = resolver.map_option_mapping({"variation_width_in": "12", "variation_height_in": "34.5"})
    assert mapped == {"width": "12", "height": "34.5"}


def test_map_option_mapping_preserves_non_dimension_axes():
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    mapped = resolver.map_option_mapping(
        {
            "variation_width_in": "30",
            "variation_door_handing": "Left",
        }
    )
    assert mapped == {"width": "30", "variation_door_handing": "Left"}


def test_build_relation_fields_from_canonical_mappings():
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    fields = resolver.build_relation_fields(
        ["C1", "C2"],
        [
            {"variation_width_in": "12"},
            {"variation_width_in": "15"},
        ],
    )
    assert fields["configurable_attributes"] == "width"
    assert fields["configurable_variation_axis"] == "width"
    assert "width=Width" in fields["configurable_variation_labels"]
    assert fields["configurable_variations"] == "sku=C1,width=12|sku=C2,width=15"


def test_build_relation_fields_includes_derived_axis_labels():
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    fields = resolver.build_relation_fields(
        ["C1", "C2"],
        [
            {"variation_width_in": "30", "variation_door_handing": "Left"},
            {"variation_width_in": "30", "variation_door_handing": "Right"},
        ],
    )
    assert fields["configurable_attributes"] == "width,variation_door_handing"
    assert fields["configurable_variation_labels"] == "width=Width,variation_door_handing=Door Handing"
    assert "variation_door_handing=Left" in fields["configurable_variations"]
    assert "variation_door_handing=Right" in fields["configurable_variations"]


@pytest.mark.parametrize(
    ("canonical", "channel", "label"),
    [
        ("variation_width_in", "width", "Width"),
        ("variation_height_in", "height", "Height"),
        ("variation_angle", "angle", "Angle"),
    ],
)
def test_single_axis_labels_are_short_dimension_labels(canonical, channel, label):
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    fields = resolver.build_relation_fields(
        ["C1", "C2"],
        [
            {canonical: "12"},
            {canonical: "15"},
        ],
    )
    assert fields["configurable_attributes"] == channel
    assert fields["configurable_variation_labels"] == f"{channel}={label}"


def test_map_option_mapping_ignores_variation_option_label():
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    mapped = resolver.map_option_mapping(
        {
            "variation_option_label": "36 in W x 30 in H x 21 in D",
            "variation_width_in": "36",
            "variation_height_in": "30",
            "variation_depth_in": "21",
        }
    )
    assert mapped == {"width": "36", "height": "30", "depth": "21"}


def test_build_relation_fields_ignores_variation_option_label_only_mapping():
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    fields = resolver.build_relation_fields(
        ["C1"],
        [{"variation_option_label": "36 in W x 30 in H x 21 in D"}],
    )
    assert "configurable_variations" not in fields or "variation_option_label" not in fields.get(
        "configurable_variations", ""
    )


def test_enrich_variation_group_adds_channel_view():
    resolver = ChannelVariationAxisResolver(_FakeSession(), "magento")
    group = {
        "option_attrs": ["variation_width_in"],
        "children": [
            {"sku": "C1", "option_mapping": {"variation_width_in": "12"}},
            {"sku": "C2", "option_mapping": {"variation_width_in": "15"}},
        ],
    }
    view = resolver.enrich_variation_group(group)
    assert view["option_attrs"] == ["width"]
    assert view["children"][0]["channel_option_mapping"] == {"width": "12"}
    assert view["relation_fields"]["configurable_variations"] == "sku=C1,width=12|sku=C2,width=15"
