"""Regression tests for master taxonomy pipeline helpers."""

from contextlib import contextmanager
from unittest.mock import patch

from sqlalchemy import select

from app.jobs.sync_master_taxonomy_pipeline import (
    _load_target_skus,
    _multi_connection_run_plan,
    run_master_taxonomy_pipeline,
)
from db.models import MasterProduct


def test_load_target_skus_returns_strings_not_row_objects(catalog_intent_session):
    session = catalog_intent_session
    product = MasterProduct(
        sku="ASG-B15",
        name="Test",
        row_hash="test-hash",
        is_active=True,
        category_l1="Kitchen Cabinets",
        collection="Anna Stone Gray",
    )
    session.add(product)
    session.commit()

    loaded = _load_target_skus(session, None)
    assert loaded == ["ASG-B15"]
    for sku in loaded:
        assert isinstance(sku, str)

    # Guard against scalars(select(MasterProduct.sku)) returning bare strings.
    scalar_rows = session.scalars(select(MasterProduct.sku).where(MasterProduct.is_active.is_(True))).all()
    assert scalar_rows == ["ASG-B15"]
    assert not hasattr(scalar_rows[0], "sku")


def test_multi_connection_run_plan_pushes_shopify_once():
    plan = _multi_connection_run_plan(
        magento_connection_ids=[1, 2, 1],
        shopify_connection_id=1000001,
        reprocess_master=True,
    )

    assert plan == [
        {"magento_connection_id": 1, "shopify_connection_id": 1000001, "reprocess_master": True},
        {"magento_connection_id": 2, "shopify_connection_id": None, "reprocess_master": False},
    ]


def test_run_master_taxonomy_pipeline_link_only_uses_resolved_connection_ids_for_target_skus(catalog_intent_session):
    session = catalog_intent_session
    session.add(
        MasterProduct(
            sku="ACH-W1230",
            name="W1230",
            row_hash="hash-w1230",
            is_active=True,
            category_l1="Kitchen Cabinets",
            collection="Anna Caramel Harvest",
        )
    )
    session.commit()

    @contextmanager
    def _session_scope():
        yield session

    with (
        patch("app.jobs.sync_master_taxonomy_pipeline.get_session", _session_scope),
        patch(
            "app.jobs.sync_master_taxonomy_pipeline._active_connection_id",
            side_effect=lambda _session, _model, connection_id: connection_id,
        ),
        patch(
            "app.jobs.master_taxonomy_enqueue._resolve_connections",
            return_value=(4, None, None, None, None),
        ),
        patch(
            "app.jobs.sync_master_taxonomy_pipeline._link_products_in_batches",
            return_value={"assignment_count": 1, "upserted": 1},
        ) as link_products,
    ):
        result = run_master_taxonomy_pipeline(
            dry_run=True,
            magento_connection_id=4,
            skus=["ACH-W1230"],
            push_products=False,
            taxonomy_mode="link_only",
        )

    assert result["status"] == "ok"
    assert result["connections"] == {"magento": 4, "shopify": None}
    assert result["sku_total"] == 1
    link_products.assert_called_once()
