"""Collection of tests to ensure correct handling of invalid input."""

from fastapi.testclient import TestClient
import pytest

from ..main import app


@pytest.fixture(scope="module")
def invalid_client():
    """Client used to call the app."""
    return TestClient(app)


@pytest.mark.parametrize(
    "start,preferences,status_code",
    [
        # Invalid case: no preferences at all.
        ([48.8566, 2.3522], {}, 422),

        # Invalid cases: incomplete preferences.
        ([48.084588, 7.280405], {"sightseeing": {"type": "nature", "score": 5}, # no shopping
                                 "nature": {"type": "nature", "score": 5},
                                 }, 422),
        ([48.084588, 7.280405], {"sightseeing": {"type": "nature", "score": 5}, # no nature
                                 "shopping": {"type": "shopping", "score": 5},
                                 }, 422),
        ([48.084588, 7.280405], {"nature": {"type": "nature", "score": 5},      # no sightseeing
                                 "shopping": {"type": "shopping", "score": 5},
                                 }, 422),

        # Invalid cases: unexisting coords
        ([91, 181], {"sightseeing": {"type": "nature", "score": 5},
                     "nature": {"type": "nature", "score": 5},
                     "shopping": {"type": "shopping", "score": 5},
                    }, 422),
        ([-91, 181], {"sightseeing": {"type": "nature", "score": 5},
                     "nature": {"type": "nature", "score": 5},
                     "shopping": {"type": "shopping", "score": 5},
                    }, 422),
        ([91, -181], {"sightseeing": {"type": "nature", "score": 5},
                     "nature": {"type": "nature", "score": 5},
                     "shopping": {"type": "shopping", "score": 5},
                    }, 422),
        ([-91, -181], {"sightseeing": {"type": "nature", "score": 5},
                     "nature": {"type": "nature", "score": 5},
                     "shopping": {"type": "shopping", "score": 5},
                    }, 422),
    ]
)
def test_input(invalid_client, start, preferences, status_code):   # pylint: disable=redefined-outer-name
    """
    Test new trip creation with different sets of preferences and locations.
    """
    response = invalid_client.post(
        "/trip/new",
        json={
            "preferences": preferences,
            "start": start
        }
    )
    assert response.status_code == status_code
