from db.catalog_normalization_service import (
    build_normalization_overview,
    list_collection_commerce_profiles,
    list_catalog_policies,
    list_review_queue,
    upsert_collection_commerce_profile,
    upsert_catalog_policy,
    upsert_normalization_profile,
    upsert_normalization_rule,
    upsert_value_alias,
)
from db.models import CatalogReviewQueueItem, ChannelCatalogPolicy, CatalogNormalizationRule, MasterProduct


def test_normalization_overview_counts(catalog_intent_session):
    catalog_intent_session.add(
        MasterProduct(sku="ACH-B12", name="Base", row_hash="h1", is_active=True, normalization_status="pending")
    )
    catalog_intent_session.add(
        CatalogReviewQueueItem(
            sku="ACH-B12",
            field_name="assembly_type",
            issue_code="unmapped_value",
            severity="error",
            status="open",
        )
    )
    catalog_intent_session.flush()

    overview = build_normalization_overview(catalog_intent_session)
    assert overview["master_active"] == 1
    assert overview["normalization_by_status"]["pending"] == 1
    assert overview["review_queue"]["open"] == 1


def test_catalog_policy_upsert_and_list(catalog_intent_session):
    saved = upsert_catalog_policy(
        catalog_intent_session,
        channel_code="shopify",
        connection_id=7,
        payload={
            "policy_name": "Shopify default",
            "exclude_rta": True,
            "include_assembled": True,
            "variation_mode": "simple_only",
            "scopes": [{"scope_kind": "collection", "scope_code": "anna-caramel-harvest", "action": "include"}],
        },
    )
    assert saved["channel_code"] == "shopify"
    assert saved["exclude_rta"] is True
    assert len(saved["scopes"]) == 1

    listed = list_catalog_policies(catalog_intent_session, channel_code="shopify")
    assert len(listed["policies"]) == 1
    assert listed["policies"][0]["policy_name"] == "Shopify default"
    assert catalog_intent_session.query(ChannelCatalogPolicy).count() == 1


def test_catalog_policy_boolean_strings_are_parsed_safely(catalog_intent_session):
    saved = upsert_catalog_policy(
        catalog_intent_session,
        channel_code="shopify",
        connection_id=7,
        payload={
            "policy_name": "Shopify safe booleans",
            "exclude_rta": "false",
            "publish_shell_products": "0",
            "include_assembled": "true",
            "include_accessories_without_brand": "yes",
            "is_active": "true",
        },
    )
    assert saved["exclude_rta"] is False
    assert saved["publish_shell_products"] is False
    assert saved["include_assembled"] is True
    assert saved["include_accessories_without_brand"] is True
    assert saved["is_active"] is True


def test_review_queue_list(catalog_intent_session):
    catalog_intent_session.add(
        CatalogReviewQueueItem(
            sku="ACH-B15",
            field_name="brand",
            issue_code="missing_brand",
            severity="warning",
            status="open",
        )
    )
    catalog_intent_session.flush()
    result = list_review_queue(catalog_intent_session, status="open")
    assert result["total"] == 1
    assert result["items"][0]["sku"] == "ACH-B15"


def test_normalization_profile_rule_and_alias_crud(catalog_intent_session):
    profile = upsert_normalization_profile(
        catalog_intent_session,
        payload={
            "code": "kitchen-cabinets",
            "name": "Kitchen Cabinets",
            "is_active": True,
        },
    )
    assert profile["code"] == "kitchen-cabinets"

    rule = upsert_normalization_rule(
        catalog_intent_session,
        payload={
            "profile_id": profile["id"],
            "rule_code": "ach-defaults",
            "scope_kind": "sku_prefix",
            "scope_value": "ACH",
            "priority": 10,
            "targets": [
                {"target_field": "door_style", "target_value": "Shaker"},
                {"target_field": "color_family", "target_value": "Off White"},
            ],
        },
    )
    assert rule["rule_code"] == "ach-defaults"
    assert len(rule["targets"]) == 2

    alias = upsert_value_alias(
        catalog_intent_session,
        payload={
            "entity_kind": "collection",
            "field_name": "collection",
            "alias_value": "Anna Caramel",
            "canonical_code": "anna-caramel-harvest",
            "canonical_label": "Anna Caramel Harvest",
        },
    )
    assert alias["canonical_code"] == "anna-caramel-harvest"
    assert catalog_intent_session.query(CatalogNormalizationRule).count() == 1


def test_collection_commerce_profile_crud(catalog_intent_session):
    saved = upsert_collection_commerce_profile(
        catalog_intent_session,
        payload={
            "collection_name": "Anna Snow White",
            "category_l1": "Kitchen Cabinets",
            "channel_code": "shopify",
            "connection_id": 7,
            "sample_master_sku": "ASW-SD",
            "sample_category_path_slug": "product-category/sample_doors",
            "availability_modes": ["grab_and_go", "special_order"],
            "appointment_url": "https://www.homesurplus.com/shaker-white/",
            "sample_cta_label": "Order Sample",
            "appointment_cta_label": "Book Appointment",
            "badges": ["Grab & Go"],
            "default_location_code": "1",
            "allow_geolocation": True,
            "allow_manual_selection": True,
            "location_selection_mode": "manual_with_optional_geolocation",
            "location_label": "Store Location",
            "landing_metadata": {
                "kitchen_packages": [
                    {
                        "code": "l_shape_8x10",
                        "label": "8' x 10' L-Shape Kitchen",
                        "price": 3116,
                        "currency": "USD",
                    }
                ]
            },
            "is_active": True,
        },
    )
    assert saved["channel_code"] == "shopify"
    assert saved["connection_id"] == 7
    assert saved["availability_modes_json"] == {"modes": ["grab_and_go", "special_order"]}
    assert saved["badges_json"] == {"badges": ["Grab & Go"], "availability_locations": []}
    assert saved["landing_metadata_json"]["kitchen_packages"][0]["price"] == 3116
    assert saved["default_location_code"] == "1"
    assert saved["allow_geolocation"] is True
    assert saved["allow_manual_selection"] is True
    assert saved["location_selection_mode"] == "manual_with_optional_geolocation"
    assert saved["landing_metadata_json"]["location_settings"]["location_label"] == "Store Location"

    listed = list_collection_commerce_profiles(
        catalog_intent_session,
        channel_code="shopify",
        connection_id=7,
    )
    assert listed["profiles"][0]["sample_master_sku"] == "ASW-SD"
    assert listed["profiles"][0]["default_location_code"] == "1"
