from sqlalchemy import select

from db.collection_brochure_seed import seed_collection_brochure
from db.collection_registry_identity import seal_inactive_collection_duplicates
from db.master_taxonomy_registry import upsert_collection_registry
from db.models import MasterCollectionRegistry, MasterProduct


def test_upsert_does_not_resurrect_inactive_duplicate(catalog_intent_session):
    session = catalog_intent_session
    canonical = upsert_collection_registry(
        session,
        {
            "name": "Anna Natural Rift White Oak",
            "code": "ANRO",
            "category_l1": "Kitchen Cabinets",
            "path_slug": "kitchen-cabinets/anna-natural-rift-white-oak",
        },
        allow_invent=True,
    )
    tombstone = MasterCollectionRegistry(
        code="ANRWO",
        name="Anna Natural Rift White Oak",
        path_slug="kitchen-cabinets/anna-natural-rift-white-oak",
        is_active=False,
    )
    session.add(tombstone)
    session.flush()

    result = upsert_collection_registry(
        session,
        {
            "name": "Anna Natural Rift White Oak",
            "code": "ANRWO",
            "category_l1": "Kitchen Cabinets",
            "path_slug": "kitchen-cabinets/anna-natural-rift-white-oak",
        },
        allow_invent=True,
    )
    session.flush()

    tombstone = session.get(MasterCollectionRegistry, tombstone.id)
    assert result["id"] == canonical["id"]
    assert result["code"] == "ANRO"
    assert tombstone.is_active is False
    assert "ANRWO" in (result.get("alias_codes") or [])


def test_brochure_seed_attaches_to_canonical_instead_of_duplicate_code(catalog_intent_session):
    session = catalog_intent_session
    canonical = upsert_collection_registry(
        session,
        {
            "name": "Anna Natural Rift White Oak",
            "code": "ANRO",
            "category_l1": "Kitchen Cabinets",
        },
        allow_invent=True,
    )
    seed_collection_brochure(
        session,
        {
            "source_document": {"collection_code": "ANRWO", "file_name": "x.pdf"},
            "collection": {
                "canonical_code": "anna-natural-rift-white-oak",
                "display_name": "Anna Natural Rift White Oak",
                "brand_label": "Port & Bell",
                "category_l1": "Kitchen Cabinets",
                "product_family": "Cabinets",
            },
        },
    )
    session.flush()
    rows = session.scalars(select(MasterCollectionRegistry).where(MasterCollectionRegistry.is_active.is_(True))).all()
    assert len(rows) == 1
    assert rows[0].id == canonical["id"]
    assert rows[0].code == "ANRO"


def test_seal_relinks_skus_and_keeps_tombstone(catalog_intent_session):
    session = catalog_intent_session
    canonical = MasterCollectionRegistry(
        code="MBRO",
        name="Maya Black Rift White Oak",
        path_slug="kitchen-cabinets/maya-black-rift-white-oak",
        aliases={"source_collection_code": "MBRO"},
        is_active=True,
    )
    tombstone = MasterCollectionRegistry(
        code="MBRWO",
        name="Maya Black Rift White Oak",
        path_slug="kitchen-cabinets/maya-black-rift-white-oak",
        is_active=False,
    )
    other = MasterCollectionRegistry(
        code="MS",
        name="Merrill Slate",
        path_slug="kitchen-cabinets/merrill-slate",
        is_active=True,
    )
    session.add_all([canonical, tombstone, other])
    session.flush()
    unlinked = MasterProduct(
        sku="PB-BRO-FS24",
        name="Filler",
        row_hash="h1",
        is_active=True,
        collection="Maya Black Rift White Oak",
    )
    mislinked = MasterProduct(
        sku="PB-BRO-BF3",
        name="Base",
        row_hash="h2",
        is_active=True,
        collection="Maya Black Rift White Oak",
        collection_registry_id=other.id,
    )
    session.add_all([unlinked, mislinked])
    session.flush()

    stats = seal_inactive_collection_duplicates(session)
    session.flush()

    assert stats["sealed"] == 1
    assert stats["skus_relinked"] == 2
    assert session.get(MasterCollectionRegistry, tombstone.id).is_active is False
    assert session.get(MasterProduct, unlinked.id).collection_registry_id == canonical.id
    assert session.get(MasterProduct, mislinked.id).collection_registry_id == canonical.id
    aliases = session.get(MasterCollectionRegistry, canonical.id).aliases or {}
    assert "MBRWO" in (aliases.get("code_aliases") or [])


def test_matching_styles_do_not_steal_canonical_identity(catalog_intent_session):
    session = catalog_intent_session
    anna = upsert_collection_registry(
        session,
        {
            "name": "Anna Natural Rift White Oak",
            "code": "ANRO",
            "category_l1": "Kitchen Cabinets",
        },
        allow_invent=True,
    )
    row = session.get(MasterCollectionRegistry, anna["id"])
    row.aliases = {"matching_styles": ["Harriet Pearl White"]}
    session.flush()
    harriet = upsert_collection_registry(
        session,
        {
            "name": "Harriet Pearl White",
            "code": "HPW",
            "category_l1": "Kitchen Cabinets",
        },
        allow_invent=True,
    )
    from db.collection_registry_identity import find_active_collection_registry

    found = find_active_collection_registry(session, name="Harriet Pearl White")
    assert found is not None
    assert found.id == harriet["id"]
    assert found.id != anna["id"]


def test_code_keyed_upsert_does_not_resurrect_tombstone(catalog_intent_session):
    session = catalog_intent_session
    canonical = MasterCollectionRegistry(
        code="ANRO",
        name="Anna Natural Rift White Oak",
        path_slug="kitchen-cabinets/anna-natural-rift-white-oak",
        is_active=True,
    )
    tombstone = MasterCollectionRegistry(
        code="ANRWO",
        name="Anna Natural Rift White Oak",
        path_slug="kitchen-cabinets/anna-natural-rift-white-oak",
        is_active=False,
    )
    session.add_all([canonical, tombstone])
    session.flush()

    from db.master_taxonomy_registry import _upsert_entity

    result = _upsert_entity(
        session,
        MasterCollectionRegistry,
        {"code": "ANRWO", "name": "Anna Natural Rift White Oak"},
        extra_fields={"path_slug": "kitchen-cabinets/anna-natural-rift-white-oak"},
    )
    session.flush()
    assert result["id"] == canonical.id
    assert result["code"] == "ANRO"
    assert session.get(MasterCollectionRegistry, tombstone.id).is_active is False

