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_dashboard_kitchen_packages_push_defaults_to_db_dry_run(api_client, db_enabled):
    job_result = {
        "status": "ok",
        "dry_run": True,
        "source": "db:collection_commerce_profile",
        "package_count": 2,
        "packages": [],
        "master_upsert": {"created": 0, "updated": 2},
        "channel_results": [],
    }
    with patch(
        "app.jobs.push_kitchen_packages.run_push_kitchen_packages",
        return_value=job_result,
    ) as runner:
        response = api_client.post(
            "/api/dashboard/kitchen-packages/push",
            json={
                "collection_code": "GSW",
                "channels": ["magento", "shopify"],
                "magento_connection_id": 1,
                "shopify_connection_id": 10001,
            },
        )

    assert response.status_code == 200
    body = response.json()
    assert body["status"] == "ok"
    assert body["dry_run"] is True
    assert body["source"] == "db:collection_commerce_profile"
    runner.assert_called_once_with(
        file_path=None,
        from_db=True,
        collection_codes=["GSW"],
        channels=["magento", "shopify"],
        magento_connection_id=1,
        shopify_connection_id=10001,
        apply=False,
        upsert_master=True,
        skip_missing_components=True,
        require_components_exist=False,
    )


def test_dashboard_kitchen_packages_push_accepts_file_live_apply(api_client, db_enabled):
    job_result = {
        "status": "ok",
        "dry_run": False,
        "source": "file:C:/tmp/grace.json",
        "package_count": 1,
        "packages": [],
        "master_upsert": {"created": 1, "updated": 0},
        "channel_results": [{"channel": "magento", "status": "ok", "action": "create"}],
    }
    with patch(
        "app.jobs.push_kitchen_packages.run_push_kitchen_packages",
        return_value=job_result,
    ) as runner:
        response = api_client.post(
            "/api/dashboard/kitchen-packages/push",
            json={
                "file_path": "C:/tmp/grace.json",
                "from_db": False,
                "channels": "magento",
                "dry_run": False,
                "magento_connection_id": 7,
                "skip_missing_components": False,
                "require_components_exist": True,
            },
        )

    assert response.status_code == 200
    body = response.json()
    assert body["status"] == "ok"
    assert body["dry_run"] is False
    assert body["source"] == "file:C:/tmp/grace.json"
    runner.assert_called_once_with(
        file_path="C:/tmp/grace.json",
        from_db=False,
        collection_codes=None,
        channels=["magento"],
        magento_connection_id=7,
        shopify_connection_id=None,
        apply=True,
        upsert_master=True,
        skip_missing_components=False,
        require_components_exist=True,
    )


def test_dashboard_kitchen_packages_push_rejects_invalid_channel(api_client, db_enabled):
    response = api_client.post(
        "/api/dashboard/kitchen-packages/push",
        json={"channels": ["amazon"]},
    )

    assert response.status_code == 400
    assert "magento" in response.json()["detail"]
