from db.collection_landing_pages import list_collection_landing_pages, upsert_collection_landing_page
from db.master_taxonomy_merge import merge_taxonomy_nodes, register_taxonomy_path_alias
from db.master_taxonomy_sync import upsert_taxonomy_node
from db.models import CollectionLandingPage, MasterProduct


def test_list_collections_collapses_merged_taxonomy_aliases(catalog_intent_session):
    session = catalog_intent_session
    parent = upsert_taxonomy_node(
        session,
        {"name": "Kitchen Cabinets", "path_slug": "kitchen-cabinets", "node_kind": "hub"},
    )["node"]
    canonical = upsert_taxonomy_node(
        session,
        {
            "name": "Anna Snow White",
            "path_slug": "kitchen-cabinets/anna-snow-white",
            "parent_id": parent["id"],
            "node_kind": "collection",
        },
    )["node"]
    alias = upsert_taxonomy_node(
        session,
        {
            "name": "Snow White",
            "path_slug": "kitchen-cabinets/snow-white",
            "parent_id": parent["id"],
            "node_kind": "collection",
        },
    )["node"]
    session.flush()

    merge_taxonomy_nodes(
        session,
        canonical_node_id=canonical["id"],
        alias_node_ids=[alias["id"]],
        dry_run=False,
    )

    product = MasterProduct(
        sku="ASW-B12",
        name="Base Cabinet",
        category_l1="Kitchen Cabinets",
        collection="Snow White",
        row_hash="h-asw",
        is_active=True,
    )
    session.add(product)
    session.flush()

    rows = list_collection_landing_pages(session, category_l1="Kitchen Cabinets")
    slugs = {row["path_slug"] for row in rows}
    assert "kitchen-cabinets/anna-snow-white" in slugs
    assert "kitchen-cabinets/snow-white" not in slugs

    anna = next(row for row in rows if row["path_slug"] == "kitchen-cabinets/anna-snow-white")
    assert anna["collection"] == "Anna Snow White"
    assert anna.get("sku_count", 0) >= 1


def test_list_collections_prefers_canonical_landing_page_row(catalog_intent_session):
    session = catalog_intent_session
    parent = upsert_taxonomy_node(
        session,
        {"name": "Kitchen Cabinets", "path_slug": "kitchen-cabinets", "node_kind": "hub"},
    )["node"]
    canonical = upsert_taxonomy_node(
        session,
        {
            "name": "Anna Snow White",
            "path_slug": "kitchen-cabinets/anna-snow-white",
            "parent_id": parent["id"],
            "node_kind": "collection",
        },
    )["node"]
    register_taxonomy_path_alias(
        session,
        alias_path_slug="kitchen-cabinets/snow-white",
        canonical_node_id=canonical["id"],
        notes="test alias",
    )
    upsert_collection_landing_page(
        session,
        {
            "path_slug": "kitchen-cabinets/anna-snow-white",
            "category_l1": "Kitchen Cabinets",
            "collection": "Anna Snow White",
            "title": "Anna Snow White",
            "subtitle": "Preferred landing copy",
        },
    )
    session.add(
        CollectionLandingPage(
            path_slug="kitchen-cabinets/snow-white",
            page_type="collection",
            category_l1="Kitchen Cabinets",
            collection="Snow White",
            title="Snow White",
            is_active=True,
        )
    )
    session.flush()

    rows = list_collection_landing_pages(session, category_l1="Kitchen Cabinets", include_inferred=False)
    slugs = {row["path_slug"] for row in rows}
    assert slugs == {"kitchen-cabinets/anna-snow-white"}
    row = rows[0]
    assert row["subtitle"] == "Preferred landing copy"
    assert "kitchen-cabinets/snow-white" in (row.get("merged_from_slugs") or [])
