import pytest
from django.test import override_settings
from django.urls import NoReverseMatch, reverse

from sentry.testutils.cases import APITestCase, SnubaTestCase
from sentry.testutils.helpers.datetime import before_now, freeze_time, iso_format


class EventIdLookupEndpointTest(APITestCase, SnubaTestCase):
    def setUp(self):
        super().setUp()
        min_ago = iso_format(before_now(minutes=1))
        self.org = self.create_organization(owner=self.user)
        self.project = self.create_project(organization=self.org)

        self.event = self.store_event(
            data={
                "event_id": "b" * 32,
                "message": "oh no",
                "timestamp": min_ago,
                "fingerprint": ["group-1"],
            },
            project_id=self.project.id,
        )

        self.group = self.event.group
        self.login_as(user=self.user)

    def test_simple(self):
        url = reverse(
            "sentry-api-0-event-id-lookup",
            kwargs={"organization_id_or_slug": self.org.slug, "event_id": self.event.event_id},
        )
        response = self.client.get(url, format="json")

        assert response.status_code == 200, response.content
        assert response.data["organizationSlug"] == self.org.slug
        assert response.data["projectSlug"] == self.project.slug
        assert response.data["groupId"] == str(self.group.id)
        assert response.data["eventId"] == str(self.event.event_id)
        assert response.data["event"]["id"] == str(self.event.event_id)

    def test_missing_eventid(self):
        url = reverse(
            "sentry-api-0-event-id-lookup",
            kwargs={"organization_id_or_slug": self.org.slug, "event_id": "c" * 32},
        )
        response = self.client.get(url, format="json")

        assert response.status_code == 404, response.content

    @override_settings(SENTRY_SELF_HOSTED=False)
    def test_ratelimit(self):
        url = reverse(
            "sentry-api-0-event-id-lookup",
            kwargs={"organization_id_or_slug": self.org.slug, "event_id": self.event.event_id},
        )
        with freeze_time("2000-01-01"):
            for i in range(10):
                self.client.get(url, format="json")
            resp = self.client.get(url, format="json")
            assert resp.status_code == 429

    def test_invalid_event_id(self):
        with pytest.raises(NoReverseMatch):
            reverse(
                "sentry-api-0-event-id-lookup",
                kwargs={
                    "organization_id_or_slug": self.org.slug,
                    "event_id": "not-an-event",
                },
            )

        url = reverse(
            "sentry-api-0-event-id-lookup",
            kwargs={"organization_id_or_slug": self.org.slug, "event_id": 123456},
        )
        resp = self.client.get(url, format="json")

        assert resp.status_code == 400