"""Tests for analytics app GraphQL queries."""

import pytest
from tests.backend.graphql.conftest import GraphQLTestClient

from accounts.tests.factories import UserFactory, WorkspaceFactory, WorkspaceMembershipFactory

from .factories import EventFactory


@pytest.mark.django_db
class TestEventsQuery:
    """Tests for events query."""

    def test_events_returns_workspace_events(self):
        """Test that events query returns all events in a workspace."""
        user = UserFactory()
        workspace = WorkspaceFactory()
        WorkspaceMembershipFactory(user=user, workspace=workspace)

        EventFactory.create_batch(3, workspace=workspace)

        client = GraphQLTestClient(user=user)
        result = client.execute(
            """
            query Events($workspaceId: ID!) {
                events(workspaceId: $workspaceId) {
                    id
                    name
                    properties
                }
            }
            """,
            variables={"workspaceId": str(workspace.id)},
        )

        assert result.errors is None
        assert len(result.data["events"]) == 3

    def test_events_filters_by_name(self):
        """Test that events can be filtered by name."""
        user = UserFactory()
        workspace = WorkspaceFactory()
        WorkspaceMembershipFactory(user=user, workspace=workspace)

        EventFactory(workspace=workspace, name="user.signup")
        EventFactory(workspace=workspace, name="user.signup")
        EventFactory(workspace=workspace, name="user.login")

        client = GraphQLTestClient(user=user)
        result = client.execute(
            """
            query Events($workspaceId: ID!, $name: String) {
                events(workspaceId: $workspaceId, name: $name) {
                    id
                    name
                }
            }
            """,
            variables={"workspaceId": str(workspace.id), "name": "user.signup"},
        )

        assert result.errors is None
        assert len(result.data["events"]) == 2
        assert all(e["name"] == "user.signup" for e in result.data["events"])

    def test_events_returns_empty_for_unauthenticated(self):
        """Test that events query returns empty for unauthenticated users."""
        workspace = WorkspaceFactory()
        EventFactory.create_batch(3, workspace=workspace)

        client = GraphQLTestClient()
        result = client.execute(
            """
            query Events($workspaceId: ID!) {
                events(workspaceId: $workspaceId) {
                    id
                }
            }
            """,
            variables={"workspaceId": str(workspace.id)},
        )

        assert result.errors is None
        assert result.data["events"] == []

    def test_events_returns_empty_for_non_member(self):
        """Test that events query returns empty for non-members."""
        user = UserFactory()
        workspace = WorkspaceFactory()
        EventFactory.create_batch(3, workspace=workspace)

        client = GraphQLTestClient(user=user)
        result = client.execute(
            """
            query Events($workspaceId: ID!) {
                events(workspaceId: $workspaceId) {
                    id
                }
            }
            """,
            variables={"workspaceId": str(workspace.id)},
        )

        assert result.errors is None
        assert result.data["events"] == []


@pytest.mark.django_db
class TestEventQuery:
    """Tests for event query."""

    def test_event_returns_single_event(self):
        """Test that event query returns a specific event."""
        user = UserFactory()
        workspace = WorkspaceFactory()
        WorkspaceMembershipFactory(user=user, workspace=workspace)
        event = EventFactory(workspace=workspace, name="test.event")

        client = GraphQLTestClient(user=user)
        result = client.execute(
            """
            query Event($id: ID!) {
                event(id: $id) {
                    id
                    name
                }
            }
            """,
            variables={"id": str(event.id)},
        )

        assert result.errors is None
        assert result.data["event"]["name"] == "test.event"

    def test_event_returns_none_for_nonexistent(self):
        """Test that event returns null for nonexistent event."""
        user = UserFactory()

        client = GraphQLTestClient(user=user)
        result = client.execute(
            """
            query Event($id: ID!) {
                event(id: $id) {
                    id
                }
            }
            """,
            variables={"id": "99999"},
        )

        assert result.errors is None
        assert result.data["event"] is None

    def test_event_returns_none_for_no_access(self):
        """Test that event returns null when user has no access."""
        user = UserFactory()
        workspace = WorkspaceFactory()
        event = EventFactory(workspace=workspace)

        client = GraphQLTestClient(user=user)
        result = client.execute(
            """
            query Event($id: ID!) {
                event(id: $id) {
                    id
                }
            }
            """,
            variables={"id": str(event.id)},
        )

        assert result.errors is None
        assert result.data["event"] is None
