from db.catalog_intent_planner import (
    category_targets_for_product,
    plan_product_catalog_intent,
    shopify_collection_targets_for_product,
)
from db.models import MasterProduct


def _product():
    product = MasterProduct()
    product.sku = "ACH-W2424"
    product.category_l1 = "Kitchen Cabinets"
    product.brand = "Port & Bell"
    product.collection = "Anna Caramel Harvest"
    product.assembly_type = "Assembled"
    return product


def test_plan_product_catalog_intent_includes_paths_and_collections():
    product = _product()
    plan = plan_product_catalog_intent(
        product,
        {"cabinet_type_sub_category_1": "Wall", "cabinet_type_sub_category_2": "Wall Cabinet"},
    )
    assert "All Products" in plan["category_paths"]
    assert plan["collection_path_slug"]
    assert plan["shopify_collection_titles"]


def test_category_targets_grey_normalized_in_collection_path():
    product = _product()
    product.collection = "Anna Stone Grey"
    targets = category_targets_for_product(product, {})
    assert any("Gray" in target for target in targets)


def test_shopify_collection_targets_include_type_labels():
    product = _product()
    category_paths = category_targets_for_product(product, {"cabinet_type_sub_category_1": "Wall"})
    targets = shopify_collection_targets_for_product(product, category_paths, {"cabinet_type_sub_category_1": "Wall"})
    assert "Wall" in targets


def test_category_targets_include_wall_detail_category():
    product = _product()
    product.sku = "ACH-W2430"
    product.name = "W2430 - Anna Caramel Harvest - Wall"
    targets = category_targets_for_product(
        product,
        {"cabinet_type_sub_category_1": "Wall", "cabinet_type_sub_category_2": "Wall Cabinet"},
    )
    assert "Kitchen Cabinets/Wall Cabinets/Basic Wall" in targets
    assert "Kitchen Cabinets/Wall Cabinets/Bridge Wall" not in targets


def test_category_targets_normalize_attribute_like_wall_subtype_to_basic_wall():
    product = _product()
    product.sku = "ACH-W1230"
    product.name = "W1230 - Anna Caramel Harvest - Port & Bell - Wall 30H -- Assembled --"
    targets = category_targets_for_product(
        product,
        {
            "cabinet_type_sub_category_1": "Wall",
            "cabinet_type_sub_category_2": "Single Door Wall Cabinet",
        },
    )
    assert "Kitchen Cabinets/Wall Cabinets/Basic Wall" in targets
    assert "Kitchen Cabinets/Wall Cabinets/Single Door Wall Cabinet" not in targets


def test_category_targets_classify_bridge_and_corner_wall():
    product = _product()
    product.sku = "ACH-W3012B"
    product.name = "W3012B - Anna Caramel Harvest - Bridge Wall"
    targets = category_targets_for_product(product, {"cabinet_type_sub_category_1": "Wall"})
    assert "Kitchen Cabinets/Wall Cabinets/Bridge Wall" in targets

    product.sku = "ACH-W301824"
    product.name = '30"W x 18"H Double Door Wall Cabinet (W301824)'
    targets = category_targets_for_product(product, {"cabinet_type_sub_category_1": "Wall"})
    assert "Kitchen Cabinets/Wall Cabinets/Bridge Wall" in targets
    assert "Kitchen Cabinets/Wall Cabinets/Basic Wall" not in targets

    product.sku = "ACH-WCOR2415"
    product.name = "WCOR2415 - Anna Caramel Harvest - Corner Wall"
    targets = category_targets_for_product(product, {"cabinet_type_sub_category_1": "Wall"})
    assert "Kitchen Cabinets/Wall Cabinets/Open Pie Cut Corner Wall Cabinet" in targets


def test_category_targets_classify_angle_end_and_blind_corner_wall():
    product = _product()
    attrs = {"cabinet_type_sub_category_1": "Wall"}

    product.sku = "FGH-WAE1230"
    product.name = "WECA30 WAE1230 - Galaxy Horizon - Fabuwood - Wall Angle End"
    targets = category_targets_for_product(product, attrs)
    assert "Kitchen Cabinets/Wall Cabinets/Angle End Wall Cabinet" in targets
    assert "Kitchen Cabinets/Wall Cabinets/Special Wall" not in targets

    product.sku = "ACH-WBC2730"
    product.name = "WBC2730 - Blind Corner Wall"
    targets = category_targets_for_product(product, attrs)
    assert "Kitchen Cabinets/Wall Cabinets/Blind Corner Wall Cabinet" in targets
    assert "Kitchen Cabinets/Wall Cabinets/Special Wall" not in targets


def test_category_targets_classify_gdw_glass_walls_not_basic_wall():
    """GDW* must not match the solid W#### Basic Wall size regex."""
    product = _product()
    attrs = {"cabinet_type_sub_category_1": "Wall"}

    product.sku = "ACH-GDW1215"
    product.name = '12"W x 15"H Single Door Glass Wall Cabinet (GDW1215)'
    targets = category_targets_for_product(product, attrs)
    assert "Kitchen Cabinets/Wall Cabinets/Stacked Wall" in targets
    assert "Kitchen Cabinets/Wall Cabinets/Basic Wall" not in targets

    product.sku = "ACH-GDW1530"
    product.name = '15"W x 30"H Single Door Glass Wall Cabinet (GDW1530)'
    targets = category_targets_for_product(product, attrs)
    assert "Kitchen Cabinets/Wall Cabinets/Single Door Glass Wall Cabinet" in targets
    assert "Kitchen Cabinets/Wall Cabinets/Basic Wall" not in targets

    product.sku = "ACH-GDW3030"
    product.name = '30"W x 30"H Double Door Glass Wall Cabinet (GDW3030)'
    targets = category_targets_for_product(product, attrs)
    assert "Kitchen Cabinets/Wall Cabinets/Double Door Glass Wall Cabinet" in targets
    assert "Kitchen Cabinets/Wall Cabinets/Basic Wall" not in targets


def test_category_targets_use_workbook_cabinet_hierarchy_labels():
    product = _product()
    product.sku = "ACH-B12"
    product.name = "B12 - Anna Caramel Harvest - Port & Bell - Base -- Assembled --"
    targets = category_targets_for_product(
        product,
        {
            "cabinet_type_sub_category_1": "Base",
            "cabinet_type_sub_category_2": "Single Door Base Cabinet",
        },
    )
    assert "Kitchen Cabinets/Base Cabinets/Single Door" in targets
    assert "Kitchen Cabinets/Anna Caramel Harvest" in targets
    assert "Kitchen Cabinets/Base Cabinets/Basic Base" not in targets


def test_category_targets_canonicalize_accessory_and_tall_workbook_labels():
    product = _product()
    product.sku = "ACH-BWB18"
    product.name = "BWB18 - Anna Caramel Harvest - Base Trash Pullout 2Bin 35Qt"
    targets = category_targets_for_product(
        product,
        {
            "cabinet_type_sub_category_1": "Storage Accessories",
            "cabinet_type_sub_category_2": "Trash Pullout",
        },
    )
    assert "Kitchen Cabinets/Accessories/Trash Storage" in targets
    assert "Kitchen Cabinets/Anna Caramel Harvest" in targets

    product.sku = "ACH-LC1884"
    product.name = "LC1884 - Anna Caramel Harvest - Linen Cabinet"
    targets = category_targets_for_product(
        product,
        {
            "cabinet_type_sub_category_1": "Tall",
            "cabinet_type_sub_category_2": "Pantry Cabinet",
        },
    )
    assert "Kitchen Cabinets/Tall Cabinets/Pantry" in targets
    assert "Kitchen Cabinets/Anna Caramel Harvest" in targets


def test_category_targets_reclassify_moulding_out_of_accessories():
    product = _product()
    product.sku = "ACH-BM8"
    product.name = "BM8 - Anna Caramel Harvest - Bead Molding"
    targets = category_targets_for_product(
        product,
        {
            "cabinet_type_sub_category_1": "Accessories",
            "cabinet_type_sub_category_2": "Additional Moldings",
        },
    )
    assert "Kitchen Cabinets/Mouldings" in targets
    assert "Kitchen Cabinets/Mouldings/Bead Molding" in targets
    assert "Kitchen Cabinets/Accessories/Additional Moldings" not in targets
    assert "Kitchen Cabinets/Accessories/Bead Molding" not in targets


def test_category_targets_reclassify_fillers_out_of_accessories():
    product = _product()
    product.sku = "ACH-BF3"
    product.name = "BF3 - Anna Caramel Harvest - Filler Base"
    targets = category_targets_for_product(
        product,
        {
            "cabinet_type_sub_category_1": "Accessories",
            "cabinet_type_sub_category_2": "Accessories",
        },
    )
    assert "Kitchen Cabinets/Panels and Fillers" in targets
    assert "Kitchen Cabinets/Panels and Fillers/Fillers" in targets
    assert "Kitchen Cabinets/Accessories" not in targets
