from app.jobs.push_channel_sample import push_magento_sample


def test_force_relations_survives_products_only_skip_images(monkeypatch):
    """channel_full_publish --skip-images sets products_only; --force-relations must still apply."""
    captured = {}

    class _Sess:
        def commit(self):
            return None

    def _fake_enqueue(session, **kwargs):
        captured["extra_options"] = dict(kwargs.get("extra_options") or {})
        return {
            "queue_id": 99,
            "label": "test",
            "options": kwargs.get("extra_options") or {},
            "native_connection_id": 1,
            "connection_id": 1,
            "sku_count": 1,
            "skus": ["ESW-GD-WDC-PARENT"],
        }

    monkeypatch.setattr(
        "db.compat_connections.decode_compat_connection_id",
        lambda _cid: ("magento", 1),
    )
    monkeypatch.setattr("app.jobs.push_channel_sample._enqueue_magento", _fake_enqueue)

    result = push_magento_sample(
        _Sess(),
        skus=["ESW-GD-WDC-PARENT"],
        connection_id=1,
        dry_run=True,
        images_only=False,
        products_only=True,
        phased=False,
        wait=False,
        run_worker=False,
        wait_timeout=1,
        force_products=True,
        force_relations=True,
        run_pull_after=True,
    )

    opts = captured["extra_options"]
    assert opts.get("products_only") is True
    assert opts.get("force_relations") is True
    assert opts.get("expand_relations") is True
    assert opts.get("force_upsert") is True
    assert opts.get("run_pull_after") is True
    assert opts.get("use_connection_pending_table") is True
    assert result["status"] == "queued"


def test_push_magento_sample_can_disable_connection_pending_table(monkeypatch):
    captured = {}

    class _Sess:
        def commit(self):
            return None

    def _fake_enqueue(session, **kwargs):
        captured["extra_options"] = dict(kwargs.get("extra_options") or {})
        return {
            "queue_id": 100,
            "label": "test",
            "options": kwargs.get("extra_options") or {},
            "native_connection_id": 1,
            "connection_id": 1,
            "sku_count": 1,
            "skus": ["ACH-B-PARENT"],
        }

    monkeypatch.setattr(
        "db.compat_connections.decode_compat_connection_id",
        lambda _cid: ("magento", 1),
    )
    monkeypatch.setattr("app.jobs.push_channel_sample._enqueue_magento", _fake_enqueue)

    result = push_magento_sample(
        _Sess(),
        skus=["ACH-B-PARENT"],
        connection_id=1,
        dry_run=True,
        images_only=False,
        products_only=False,
        phased=False,
        wait=False,
        run_worker=False,
        wait_timeout=1,
        use_connection_pending_table=False,
    )

    assert captured["extra_options"].get("use_connection_pending_table") is False
    assert result["status"] == "queued"


def test_push_magento_sample_filters_rta_skus(monkeypatch):
    captured = {}

    class _Sess:
        def commit(self):
            return None

    def _fake_enqueue(session, **kwargs):
        captured["skus"] = list(kwargs.get("skus") or [])
        return {
            "queue_id": 101,
            "label": "test",
            "options": kwargs.get("extra_options") or {},
            "native_connection_id": 1,
            "connection_id": 1,
            "sku_count": len(captured["skus"]),
            "skus": captured["skus"],
        }

    monkeypatch.setattr(
        "db.compat_connections.decode_compat_connection_id",
        lambda _cid: ("magento", 1),
    )
    monkeypatch.setattr("app.jobs.push_channel_sample._enqueue_magento", _fake_enqueue)

    result = push_magento_sample(
        _Sess(),
        skus=["RTA-ACH-B12", "ACH-B12"],
        connection_id=1,
        dry_run=True,
        images_only=False,
        products_only=False,
        phased=False,
        wait=False,
        run_worker=False,
        wait_timeout=1,
    )

    assert captured["skus"] == ["ACH-B12"]
    assert result["sku_count"] == 1
