import pandas as pd

from db.shared_sku_membership import (
    bulk_upsert_shared_sku_memberships,
    get_shared_sku_membership_detail,
    get_shared_sku_membership_details,
    import_shared_sku_membership_dataframe,
    list_shared_sku_memberships,
    split_master_sku_values,
    upsert_shared_sku_membership,
)
from db.master_taxonomy_sync import upsert_taxonomy_node
from db.models import MasterProduct


def _seed_collection(session, *, name: str, path_slug: str, parent_id: int) -> None:
    upsert_taxonomy_node(
        session,
        {
            "name": name,
            "path_slug": path_slug,
            "parent_id": parent_id,
            "node_kind": "collection",
        },
    )


def test_upsert_shared_sku_membership_assigns_explicit_collections(catalog_intent_session):
    session = catalog_intent_session
    parent = upsert_taxonomy_node(
        session,
        {"name": "Kitchen Cabinets", "path_slug": "kitchen-cabinets", "node_kind": "hub"},
    )["node"]
    _seed_collection(
        session,
        name="Anna Snow White",
        path_slug="kitchen-cabinets/anna-snow-white",
        parent_id=parent["id"],
    )
    _seed_collection(
        session,
        name="Grace Snow White",
        path_slug="kitchen-cabinets/grace-snow-white",
        parent_id=parent["id"],
    )
    session.add(
        MasterProduct(
            sku="PB-PW-BF3",
            name="Pearl White Base Filler",
            category_l1="Kitchen Cabinets",
            collection="Harriet Pearl White",
            membership_mode="native",
            row_hash="h-shared-ui",
            is_active=True,
        )
    )
    session.flush()

    detail = upsert_shared_sku_membership(
        session,
        master_sku="PB-PW-BF3",
        membership_mode="shared",
        collection_path_slugs=[
            "kitchen-cabinets/anna-snow-white",
            "kitchen-cabinets/grace-snow-white",
        ],
        source_label="test",
    )

    assert detail["membership_mode"] == "shared"
    assert detail["active_collection_path_slugs"] == [
        "kitchen-cabinets/anna-snow-white",
        "kitchen-cabinets/grace-snow-white",
    ]
    listing = list_shared_sku_memberships(session, membership_mode="shared")
    assert listing[0]["master_sku"] == "PB-PW-BF3"
    assert listing[0]["shared_collection_count"] == 2


def test_upsert_shared_sku_membership_native_mode_deactivates_assignments(catalog_intent_session):
    session = catalog_intent_session
    parent = upsert_taxonomy_node(
        session,
        {"name": "Kitchen Cabinets", "path_slug": "kitchen-cabinets", "node_kind": "hub"},
    )["node"]
    _seed_collection(
        session,
        name="Anna Snow White",
        path_slug="kitchen-cabinets/anna-snow-white",
        parent_id=parent["id"],
    )
    session.add(
        MasterProduct(
            sku="PB-PW-BF3",
            name="Pearl White Base Filler",
            category_l1="Kitchen Cabinets",
            collection="Harriet Pearl White",
            membership_mode="shared",
            row_hash="h-shared-ui",
            is_active=True,
        )
    )
    session.flush()
    upsert_shared_sku_membership(
        session,
        master_sku="PB-PW-BF3",
        membership_mode="shared",
        collection_path_slugs=["kitchen-cabinets/anna-snow-white"],
    )

    detail = upsert_shared_sku_membership(
        session,
        master_sku="PB-PW-BF3",
        membership_mode="native",
        collection_path_slugs=[],
    )

    assert detail["membership_mode"] == "native"
    assert detail["active_collection_path_slugs"] == []
    assert len(detail["inactive_memberships"]) == 1


def test_import_shared_sku_membership_dataframe_groups_rows_by_sku(catalog_intent_session):
    session = catalog_intent_session
    parent = upsert_taxonomy_node(
        session,
        {"name": "Kitchen Cabinets", "path_slug": "kitchen-cabinets", "node_kind": "hub"},
    )["node"]
    _seed_collection(
        session,
        name="Anna Snow White",
        path_slug="kitchen-cabinets/anna-snow-white",
        parent_id=parent["id"],
    )
    _seed_collection(
        session,
        name="Grace Snow White",
        path_slug="kitchen-cabinets/grace-snow-white",
        parent_id=parent["id"],
    )
    session.add(
        MasterProduct(
            sku="PB-PW-BF3",
            name="Pearl White Base Filler",
            category_l1="Kitchen Cabinets",
            collection="Harriet Pearl White",
            membership_mode="native",
            row_hash="h-shared-ui",
            is_active=True,
        )
    )
    session.flush()

    frame = pd.DataFrame(
        [
            {"sku": "PB-PW-BF3", "collection_path_slug": "kitchen-cabinets/anna-snow-white", "membership_mode": "shared"},
            {"sku": "PB-PW-BF3", "collection_path_slug": "kitchen-cabinets/grace-snow-white", "membership_mode": "shared"},
        ]
    )

    result = import_shared_sku_membership_dataframe(session, frame)
    detail = get_shared_sku_membership_detail(session, "PB-PW-BF3")

    assert result["updated"] == 1
    assert result["error_count"] == 0
    assert detail["active_collection_path_slugs"] == [
        "kitchen-cabinets/anna-snow-white",
        "kitchen-cabinets/grace-snow-white",
    ]


def test_split_master_sku_values_accepts_comma_and_newline_lists():
    assert split_master_sku_values("pb-pw-bf3, PB-CH-TK8\nPB-CH-TK8") == [
        "PB-PW-BF3",
        "PB-CH-TK8",
    ]


def test_list_shared_sku_memberships_searches_master_sku_only(catalog_intent_session):
    session = catalog_intent_session
    session.add_all(
        [
            MasterProduct(
                sku="PB-BRO-BF6",
                name="Brown Base Filler",
                category_l1="Kitchen Cabinets",
                collection="Brown Collection",
                membership_mode="native",
                row_hash="h-shared-search-1",
                is_active=True,
            ),
            MasterProduct(
                sku="ZZ-001",
                name="PB-BRO marketing sample",
                category_l1="Kitchen Cabinets",
                collection="PB-BRO display set",
                membership_mode="native",
                row_hash="h-shared-search-2",
                is_active=True,
            ),
        ]
    )
    session.flush()

    listing = list_shared_sku_memberships(session, search="PB-BRO", membership_mode="")

    assert [row["master_sku"] for row in listing] == ["PB-BRO-BF6"]


def test_list_shared_sku_memberships_includes_inactive_master_skus(catalog_intent_session):
    session = catalog_intent_session
    session.add_all(
        [
            MasterProduct(
                sku="PB-BRO-BF6",
                name="Brown Base Filler",
                category_l1="Kitchen Cabinets",
                collection="Brown Collection",
                membership_mode="native",
                row_hash="h-shared-search-active",
                is_active=True,
            ),
            MasterProduct(
                sku="PB-BRO-F396",
                name="Brown Filler 396",
                category_l1="Kitchen Cabinets",
                collection="Brown Collection",
                membership_mode="native",
                row_hash="h-shared-search-inactive",
                is_active=False,
            ),
        ]
    )
    session.flush()

    listing = list_shared_sku_memberships(session, search="PB-BRO", membership_mode="")

    assert [row["master_sku"] for row in listing] == ["PB-BRO-BF6", "PB-BRO-F396"]


def test_bulk_upsert_shared_sku_memberships_applies_same_membership_to_many_skus(catalog_intent_session):
    session = catalog_intent_session
    parent = upsert_taxonomy_node(
        session,
        {"name": "Kitchen Cabinets", "path_slug": "kitchen-cabinets", "node_kind": "hub"},
    )["node"]
    _seed_collection(
        session,
        name="Anna Snow White",
        path_slug="kitchen-cabinets/anna-snow-white",
        parent_id=parent["id"],
    )
    session.add_all(
        [
            MasterProduct(
                sku="PB-PW-BF3",
                name="Pearl White Base Filler",
                category_l1="Kitchen Cabinets",
                collection="Harriet Pearl White",
                membership_mode="native",
                row_hash="h-shared-ui-1",
                is_active=True,
            ),
            MasterProduct(
                sku="PB-CH-TK8",
                name="Touch Up Kit",
                category_l1="Kitchen Cabinets",
                collection="Harriet Pearl White",
                membership_mode="native",
                row_hash="h-shared-ui-2",
                is_active=True,
            ),
        ]
    )
    session.flush()

    result = bulk_upsert_shared_sku_memberships(
        session,
        master_skus=["PB-PW-BF3", "PB-CH-TK8"],
        membership_mode="shared",
        collection_path_slugs=["kitchen-cabinets/anna-snow-white"],
        source_label="test",
    )
    details = get_shared_sku_membership_details(session, ["PB-PW-BF3", "PB-CH-TK8"])

    assert result["updated"] == 2
    assert result["error_count"] == 0
    assert all(item["active_collection_path_slugs"] == ["kitchen-cabinets/anna-snow-white"] for item in details)
