import pytest

from app.notify_client.notification_api_client import NotificationApiClient


@pytest.mark.parametrize(
    ("arguments", "expected_call"),
    [
        ({}, {"url": "/service/abcd1234/notifications", "params": {}}),
        (
            {"page": 99},
            {"url": "/service/abcd1234/notifications", "params": {"page": 99}},
        ),
        (
            {"include_jobs": False},
            {
                "url": "/service/abcd1234/notifications",
                "params": {"include_jobs": False},
            },
        ),
        (
            {"include_from_test_key": True},
            {
                "url": "/service/abcd1234/notifications",
                "params": {"include_from_test_key": True},
            },
        ),
        (
            {"page": 48, "limit_days": 3},
            {
                "url": "/service/abcd1234/notifications",
                "params": {"page": 48, "limit_days": 3},
            },
        ),
        (
            {"job_id": "efgh5678"},
            {"url": "/service/abcd1234/job/efgh5678/notifications", "params": {}},
        ),
        (
            {"job_id": "efgh5678", "page": 48},
            {
                "url": "/service/abcd1234/job/efgh5678/notifications",
                "params": {"page": 48},
            },
        ),
        (
            {"job_id": "efgh5678", "page": 48, "limit_days": 3},
            {
                "url": "/service/abcd1234/job/efgh5678/notifications",
                "params": {"page": 48},
            },
        ),
    ],
)
def test_client_gets_notifications_for_service_and_job_by_page(
    mocker, arguments, expected_call
):
    mock_get = mocker.patch(
        "app.notify_client.notification_api_client.NotificationApiClient.get"
    )
    NotificationApiClient().get_notifications_for_service("abcd1234", **arguments)
    mock_get.assert_called_once_with(**expected_call)


@pytest.mark.parametrize(
    ("arguments", "expected_call"),
    [
        (
            {"to": "2028675309"},
            {"url": "/service/abcd1234/notifications", "data": {"to": "2028675309"}},
        ),
        (
            {"to": "2028675309", "job_id": "efgh5678"},
            {
                "url": "/service/abcd1234/job/efgh5678/notifications",
                "data": {"to": "2028675309"},
            },
        ),
        (
            {"to": "2028675309", "page": 99},
            {
                "url": "/service/abcd1234/notifications",
                "data": {"to": "2028675309", "page": 99},
            },
        ),
        (
            {"to": "2028675309", "limit_days": 3},
            {
                "url": "/service/abcd1234/notifications",
                "data": {"to": "2028675309", "limit_days": 3},
            },
        ),
        (
            {"to": "2028675309", "job_id": "efgh5678", "limit_days": 3},
            {
                "url": "/service/abcd1234/job/efgh5678/notifications",
                "data": {"to": "2028675309"},
            },
        ),
    ],
)
def test_client_gets_notifications_for_service_and_job_by_page_posts_for_to(
    mocker, arguments, expected_call
):
    mock_post = mocker.patch(
        "app.notify_client.notification_api_client.NotificationApiClient.post"
    )
    NotificationApiClient().get_notifications_for_service("abcd1234", **arguments)
    mock_post.assert_called_once_with(**expected_call)


def test_send_notification(mocker, client_request, active_user_with_permissions):
    mock_post = mocker.patch(
        "app.notify_client.notification_api_client.NotificationApiClient.post"
    )
    NotificationApiClient().send_notification(
        "foo",
        template_id="bar",
        recipient="2028675301",
        personalisation=None,
        sender_id=None,
    )
    mock_post.assert_called_once_with(
        url="/service/foo/send-notification",
        data={
            "template_id": "bar",
            "to": "2028675301",
            "personalisation": None,
            "created_by": active_user_with_permissions["id"],
        },
    )


def test_get_notification(mocker):
    mock_get = mocker.patch(
        "app.notify_client.notification_api_client.NotificationApiClient.get"
    )
    NotificationApiClient().get_notification("foo", "bar")
    mock_get.assert_called_once_with(url="/service/foo/notifications/bar")


def test_get_notification_count_for_job_id(mocker):
    mock_get = mocker.patch(
        "app.notify_client.notification_api_client.NotificationApiClient.get"
    )
    NotificationApiClient().get_notification_count_for_job_id(
        service_id="foo", job_id="bar"
    )
    mock_get.assert_called_once_with(
        url="/service/foo/job/bar/notification_count",
    )
