from datetime import datetime, timezone

from django.urls import reverse

from sentry.models.eventerror import EventError
from sentry.models.processingissue import EventProcessingIssue, ProcessingIssue
from sentry.models.rawevent import RawEvent
from sentry.testutils.cases import APITestCase
from sentry.testutils.silo import region_silo_test


@region_silo_test
class ProjectProjectProcessingIssuesTest(APITestCase):
    def test_simple(self):
        self.login_as(user=self.user)

        team = self.create_team()
        project1 = self.create_project(teams=[team], name="foo")

        raw_event = RawEvent.objects.create(project_id=project1.id, event_id="abc")

        issue, _ = ProcessingIssue.objects.get_or_create(
            project_id=project1.id, checksum="abc", type=EventError.NATIVE_MISSING_DSYM
        )

        EventProcessingIssue.objects.get_or_create(raw_event=raw_event, processing_issue=issue)

        url = reverse(
            "sentry-api-0-project-processing-issues",
            kwargs={"organization_slug": project1.organization.slug, "project_slug": project1.slug},
        )
        response = self.client.get(url, format="json")
        assert response.status_code == 200, response.content
        assert response.data["hasIssues"] is True
        assert response.data["hasMoreResolveableIssues"] is False
        assert response.data["numIssues"] == 1
        assert response.data["issuesProcessing"] == 0
        assert response.data["resolveableIssues"] == 0

    def test_issues(self):
        self.login_as(user=self.user)

        team = self.create_team()
        project1 = self.create_project(teams=[team], name="foo")

        raw_event = RawEvent.objects.create(project_id=project1.id, event_id="abc")

        issue, _ = ProcessingIssue.objects.get_or_create(
            project_id=project1.id,
            checksum="abc",
            type=EventError.NATIVE_MISSING_DSYM,
            datetime=datetime(2013, 8, 13, 3, 8, 25, tzinfo=timezone.utc),
        )

        issue2, _ = ProcessingIssue.objects.get_or_create(
            project_id=project1.id,
            checksum="abcd",
            type=EventError.NATIVE_MISSING_DSYM,
            datetime=datetime(2014, 8, 13, 3, 8, 25, tzinfo=timezone.utc),
        )

        EventProcessingIssue.objects.get_or_create(raw_event=raw_event, processing_issue=issue)

        url = reverse(
            "sentry-api-0-project-processing-issues",
            kwargs={"organization_slug": project1.organization.slug, "project_slug": project1.slug},
        )
        response = self.client.get(url + "?detailed=1", format="json")
        assert response.status_code == 200, response.content
        assert len(response.data["issues"]) == 2
        assert response.data["numIssues"] == 2
        assert response.data["lastSeen"] == issue2.datetime
        assert response.data["hasIssues"] is True
        assert response.data["hasMoreResolveableIssues"] is False
        assert response.data["issuesProcessing"] == 0
        assert response.data["resolveableIssues"] == 0
        assert response.data["issues"][0]["checksum"] == issue.checksum
        assert response.data["issues"][0]["numEvents"] == 1
        assert response.data["issues"][0]["type"] == EventError.NATIVE_MISSING_DSYM
        assert response.data["issues"][1]["checksum"] == issue2.checksum

    def test_resolvable_issues(self):
        self.login_as(user=self.user)

        team = self.create_team()
        project1 = self.create_project(teams=[team], name="foo")

        RawEvent.objects.create(project_id=project1.id, event_id="abc")

        url = reverse(
            "sentry-api-0-project-processing-issues",
            kwargs={"organization_slug": project1.organization.slug, "project_slug": project1.slug},
        )
        response = self.client.get(url + "?detailed=1", format="json")
        assert response.status_code == 200, response.content
        assert response.data["numIssues"] == 0
        assert response.data["resolveableIssues"] == 1
        assert response.data["lastSeen"] is None
        assert response.data["hasIssues"] is False
        assert response.data["hasMoreResolveableIssues"] is False
        assert response.data["numIssues"] == 0
        assert response.data["issuesProcessing"] == 0
