from django.core.exceptions import PermissionDenied

import graphene
from graphene_django import DjangoObjectType
from graphql import GraphQLError

from aleksis.apps.tezor.models.base import Client
from aleksis.apps.tezor.models.invoice import InvoiceGroup
from aleksis.apps.tezor.schema.client import PaymentVariantChoiceType
from aleksis.core.schema.base import FilterOrderList
from aleksis.core.util.core_helpers import get_site_preferences

from ..models import Event
from .checkpoint import CheckpointCheckInMutation
from .event import EventType
from .event_additional_field import (
    EventAdditionalFieldBatchCreateMutation,
    EventAdditionalFieldBatchDeleteMutation,
    EventAdditionalFieldBatchPatchMutation,
    EventAdditionalFieldType,
)
from .event_registration import SendEventRegistrationMutation
from .terms import TermsType


class Query(graphene.ObjectType):
    event_additional_fields = FilterOrderList(EventAdditionalFieldType)

    event_by_id = graphene.Field(EventType, id=graphene.ID())
    event_by_slug = graphene.Field(EventType, slug=graphene.String())

    terms = FilterOrderList(TermsType)

    paweljong_payment_choices = graphene.List(PaymentVariantChoiceType)

    @staticmethod
    def resolve_event_by_id(root, info, id):
        event = Event.objects.get(pk=id)
        # if not info.context.user.has_perm("paweljong.view_person_rule", event):
        #     return None
        return event

    @staticmethod
    def resolve_event_by_slug(root, info, slug):
        event = Event.objects.get(slug=slug)
        # if not info.context.user.has_perm("paweljong.view_person_rule", event):
        #     return None
        return event

    @staticmethod
    def resolve_paweljong_payment_choices(root, info):
        client, __ = Client.objects.get_or_create(name=get_site_preferences()["paweljong__event_invoice_client_name"])
        group, __ = InvoiceGroup.objects.get_or_create(
            name=get_site_preferences()["paweljong__event_invoice_group_name"],
            client=client,
            defaults={
                "template_name": "paweljong/invoice_pdf.html",
            },
        )

        return group.get_variant_choices()


class Mutation(graphene.ObjectType):
    checkpoint_check_in = CheckpointCheckInMutation.Field()

    create_event_additional_fields = EventAdditionalFieldBatchCreateMutation.Field()
    delete_event_additional_fields = EventAdditionalFieldBatchDeleteMutation.Field()
    update_event_additional_fields = EventAdditionalFieldBatchPatchMutation.Field()

    send_event_registration = SendEventRegistrationMutation.Field()