from datetime import datetime, timezone

from sqlalchemy import select

from db.models import ShopifyAttributeRegistry
from db.shopify_repositories import SqlAlchemyShopifyAttributeRegistryRepository


def test_consolidate_shop_codes_merges_domain_alias_into_canonical(catalog_intent_session):
    session = catalog_intent_session
    now = datetime.now(timezone.utc)
    session.add(
        ShopifyAttributeRegistry(
            shop_code="3b302c-11.myshopify.com",
            owner_type="product_metafield",
            attribute_code="custom_door_style",
            name="Door Style",
            namespace="custom",
            key="door_style",
            data_type="list.single_line_text_field",
            is_standard=False,
            raw_json={"type": {"name": "list.single_line_text_field"}},
            fetched_at=now,
        )
    )
    session.add(
        ShopifyAttributeRegistry(
            shop_code="shopify-pb",
            owner_type="product_metafield",
            attribute_code="custom_vendor",
            name="Vendor",
            namespace="custom",
            key="vendor",
            data_type="single_line_text_field",
            is_standard=False,
            raw_json={"type": {"name": "single_line_text_field"}},
            fetched_at=now,
        )
    )
    session.commit()

    repo = SqlAlchemyShopifyAttributeRegistryRepository(session)
    stats = repo.consolidate_shop_codes("shopify-pb", ["3b302c-11.myshopify.com"])
    session.commit()

    assert stats["merged"] == 1
    rows = session.scalars(select(ShopifyAttributeRegistry)).all()
    assert len(rows) == 2
    assert {row.shop_code for row in rows} == {"shopify-pb"}
    door_style = next(row for row in rows if row.attribute_code == "custom_door_style")
    assert door_style.data_type == "list.single_line_text_field"


def test_consolidate_shop_codes_keeps_newer_duplicate(catalog_intent_session):
    session = catalog_intent_session
    older = datetime(2026, 1, 1, tzinfo=timezone.utc)
    newer = datetime(2026, 6, 1, tzinfo=timezone.utc)
    session.add(
        ShopifyAttributeRegistry(
            shop_code="shopify-pb",
            owner_type="product_metafield",
            attribute_code="custom_width",
            name="Width Old",
            namespace="custom",
            key="width",
            data_type="number_integer",
            is_standard=False,
            raw_json={"type": {"name": "number_integer"}},
            fetched_at=older,
        )
    )
    session.add(
        ShopifyAttributeRegistry(
            shop_code="3b302c-11.myshopify.com",
            owner_type="product_metafield",
            attribute_code="custom_width",
            name="Width New",
            namespace="custom",
            key="width",
            data_type="number_decimal",
            is_standard=False,
            raw_json={"type": {"name": "number_decimal"}},
            fetched_at=newer,
        )
    )
    session.commit()

    repo = SqlAlchemyShopifyAttributeRegistryRepository(session)
    stats = repo.consolidate_shop_codes("shopify-pb", ["3b302c-11.myshopify.com"])
    session.commit()

    assert stats["deleted_conflicts"] == 1
    row = session.scalar(select(ShopifyAttributeRegistry))
    assert row.shop_code == "shopify-pb"
    assert row.name == "Width New"
    assert row.data_type == "number_decimal"
