"""Integration tests for assembled_or_rta semantic filters."""

from db.master_product_filters import MasterAttributeFilter, apply_master_attribute_filters
from db.models import Base, MasterProduct, MasterProductAttributeValue
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session, sessionmaker


def _session():
    engine = create_engine("sqlite:///:memory:")
    Base.metadata.create_all(engine)
    return sessionmaker(bind=engine)()


def _add_product(session: Session, *, sku: str, name: str, assembly_type=None, attr_value=None):
    product = MasterProduct(
        sku=sku,
        name=name,
        assembly_type=assembly_type,
        row_hash=f"hash-{sku}",
        is_active=True,
    )
    session.add(product)
    session.flush()
    if attr_value is not None:
        session.add(
            MasterProductAttributeValue(
                product_id=product.id,
                sku=sku,
                attribute_code="assembled_or_rta",
                value=attr_value,
            )
        )
    session.commit()
    return product


def _filter_skus(session: Session, filters):
    stmt = select(MasterProduct.sku).where(MasterProduct.is_active.is_(True))
    stmt = apply_master_attribute_filters(stmt, filters=filters)
    return {row[0] for row in session.execute(stmt).all()}


def test_equals_unassembled_matches_rta_core_and_attribute():
    session = _session()
    _add_product(session, sku="ASM-B12", name="Base Assembled", assembly_type="Assembled")
    _add_product(session, sku="RTA-B12", name="Base --Unassembled --", assembly_type="RTA")
    _add_product(session, sku="ATTR-ONLY", name="Attr unassembled", assembly_type=None, attr_value="Unassembled")
    _add_product(session, sku="BLANK-1", name="No assembly", assembly_type=None)

    result = _filter_skus(
        session,
        [MasterAttributeFilter(code="assembled_or_rta", value="Unassembled", match="exact")],
    )
    assert result == {"RTA-B12", "ATTR-ONLY"}


def test_not_equal_unassembled_matches_assembled_and_blank():
    session = _session()
    _add_product(session, sku="ASM-B12", name="Base Assembled", assembly_type="Assembled")
    _add_product(session, sku="RTA-B12", name="Base --Unassembled --", assembly_type="RTA")
    _add_product(session, sku="BLANK-1", name="No assembly", assembly_type=None)

    result = _filter_skus(
        session,
        [MasterAttributeFilter(code="assembled_or_rta", value="Unassembled", match="not_equal")],
    )
    assert result == {"ASM-B12", "BLANK-1"}


def test_not_equal_assembled_matches_rta_and_blank():
    session = _session()
    _add_product(session, sku="ASM-B12", name="Base Assembled", assembly_type="Assembled")
    _add_product(session, sku="RTA-B12", name="Base --Unassembled --", assembly_type="RTA")
    _add_product(session, sku="BLANK-1", name="No assembly", assembly_type=None)

    result = _filter_skus(
        session,
        [MasterAttributeFilter(code="assembled_or_rta", value="Assembled", match="not_equal")],
    )
    assert result == {"RTA-B12", "BLANK-1"}


def test_equals_unassembled_matches_sku_prefix_without_assembly_type():
    session = _session()
    _add_product(session, sku="RTA-ANRO-WECA36", name="Wall --Unassembled --", assembly_type=None)

    result = _filter_skus(
        session,
        [MasterAttributeFilter(code="assembled_or_rta", value="Unassembled", match="exact")],
    )
    assert result == {"RTA-ANRO-WECA36"}
