from unittest.mock import MagicMock, patch

import pytest
from fastapi.testclient import TestClient


@pytest.fixture
def api_client():
    from main import app

    return TestClient(app)


@pytest.fixture
def db_enabled():
    cfg = MagicMock()
    cfg.enabled = True
    with patch("main.load_db_config", return_value=cfg):
        yield cfg


def test_channel_catalogs_provision_apply_queues_live_job(api_client, db_enabled):
    with patch(
        "main._start_channel_catalog_provision_job",
        return_value={
            "status": "accepted",
            "job_id": "job-123",
            "dry_run": False,
            "poll_url": "/api/channel-catalogs/provision/job-123",
        },
    ) as start_job:
        response = api_client.post(
            "/api/channel-catalogs/provision/apply",
            json={"magento_connection_id": 2},
        )

    assert response.status_code == 202
    body = response.json()
    assert body["job_id"] == "job-123"
    assert body["dry_run"] is False
    start_job.assert_called_once()
    assert start_job.call_args.kwargs["dry_run"] is False
    assert start_job.call_args.kwargs["baseline_first"] is True
    assert start_job.call_args.kwargs["magento_connection_id"] == 2


def test_channel_catalog_provision_cli_dry_run():
    with patch(
        "app.jobs.channel_catalog_provision_enqueue._execute_catalog_provision",
        return_value={"status": "ok", "dry_run": True, "product_count": 1},
    ) as execute:
        from app.jobs.channel_catalog_provision import run_channel_catalog_provision

        result = run_channel_catalog_provision(dry_run=True, magento_connection_id=2)

    assert result["product_count"] == 1
    execute.assert_called_once()
    assert execute.call_args.args[0]["dry_run"] is True
