"""Root GraphQL schema for Dexxy."""

import strawberry
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from strawberry.django.views import GraphQLView as BaseGraphQLView

# Import app queries and mutations
from accounts.graphql import AccountsMutation, AccountsQuery
from analytics.graphql import AnalyticsQuery
from billing.graphql import BillingQuery
from campaigns.graphql import CampaignsMutation, CampaignsQuery
from integrations.graphql import IntegrationsMutation, IntegrationsQuery
from members.graphql import MembersMutation, MembersQuery
from messages.graphql import MessagesMutation, MessagesQuery
from rules.graphql import RulesMutation, RulesQuery
from sources.graphql import SourcesMutation, SourcesQuery

from .context import get_context
from .extensions import get_extensions
from .mutations import AuthMutations
from .queries import AuthQueries


@strawberry.type
class Query(
    AuthQueries,
    AccountsQuery,
    MembersQuery,
    MessagesQuery,
    SourcesQuery,
    CampaignsQuery,
    RulesQuery,
    BillingQuery,
    AnalyticsQuery,
    IntegrationsQuery,
):
    """Root query type combining all app queries."""

    @strawberry.field
    def hello(self) -> str:
        """Test query to verify GraphQL is working."""
        return "GraphQL is working!"


@strawberry.type
class Mutation(
    AuthMutations,
    AccountsMutation,
    MembersMutation,
    MessagesMutation,
    SourcesMutation,
    CampaignsMutation,
    RulesMutation,
    IntegrationsMutation,
):
    """Root mutation type combining all app mutations."""

    @strawberry.mutation
    def test(self) -> str:
        """Test mutation to verify GraphQL is working."""
        return "Mutation test successful!"


# Create the schema
schema = strawberry.Schema(
    query=Query,
    mutation=Mutation,
    extensions=get_extensions(),
)


@method_decorator(csrf_exempt, name="dispatch")
class GraphQLView(BaseGraphQLView):
    """Custom GraphQL view with context.

    CSRF is exempted because GraphQL uses token-based authentication
    via the Authorization header rather than cookies.
    """

    def get_context(self, request, response):
        return get_context(request, response)
