from unittest.mock import MagicMock

from app.jobs.plytix_pull import _fetch_products, _normalize_search_path, _search_has_next_page


def test_normalize_search_path_maps_legacy_get_paths():
    assert _normalize_search_path("/products/") == "products/search"
    assert _normalize_search_path("attributes") == "attributes/product/search"
    assert _normalize_search_path("attributes/product") == "attributes/product/search"
    assert _normalize_search_path("products/search") == "products/search"


def test_fetch_products_uses_post_search_with_body_pagination():
    client = MagicMock()
    client.post.side_effect = [
        {
            "data": [{"sku": "A"}],
            "pagination": {"page": 1, "page_size": 100, "count": 1},
        },
    ]

    rows = _fetch_products(client, "products/", page_size=100, max_pages=5)

    assert rows == [{"sku": "A"}]
    client.post.assert_called_once_with(
        "products/search",
        json={"pagination": {"page": 1, "page_size": 100}},
    )
    client.get.assert_not_called()


def test_fetch_product_pages_includes_attributes_in_body():
    client = MagicMock()
    client.post.return_value = {"data": [{"sku": "A"}], "pagination": {"page": 1, "page_size": 100, "count": 1}}
    from app.jobs.plytix_pull import _fetch_product_pages

    rows = _fetch_product_pages(client, "products/", page_size=100, max_pages=1, attributes=["sku", "label"])

    assert rows == [{"sku": "A"}]
    client.post.assert_called_once_with(
        "products/search",
        json={
            "pagination": {"page": 1, "page_size": 100},
            "attributes": ["sku", "label"],
        },
    )
    client.get.assert_not_called()


def test_search_has_next_page_when_batch_is_full():
    assert _search_has_next_page({}, page=1, page_size=100, item_count=100) is True


def test_search_has_next_page_uses_total_count():
    payload = {"data": {"pagination": {"page": 1, "page_size": 100, "count": 250}}}
    assert _search_has_next_page(payload, page=1, page_size=100, item_count=100) is True
    last_page = {"data": {"pagination": {"page": 3, "page_size": 100, "count": 250}}}
    assert _search_has_next_page(last_page, page=3, page_size=100, item_count=50) is False
