from django.core.exceptions import PermissionDenied

import graphene
from calendarweek import CalendarWeek
from graphene_django import DjangoListField
from graphene_django.types import DjangoObjectType
from graphene_django_cud.mutations import (
    DjangoBatchCreateMutation,
    DjangoBatchPatchMutation,
    DjangoCreateMutation,
)
from guardian.shortcuts import get_objects_for_user

from aleksis.core.schema.base import (
    DeleteMutation,
    DjangoFilterMixin,
    PermissionBatchPatchMixin,
    PermissionsTypeMixin,
)

from ..models import Documentation


class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
    class Meta:
        model = Documentation
        fields = (
            "id",
            "course",
            "lesson_event",
            "subject",
            "topic",
            "homework",
            "group_note",
            "datetime_start",
            "datetime_end",
            "date_start",
            "date_end",
        )
        filter_fields = {
            "id": ["exact", "lte", "gte"],
            "course__name": ["exact"],
        }

    @classmethod
    def get_queryset(cls, queryset, info):
        return get_objects_for_user(info.context.user, "alsijil.view_documentation", queryset)


class DocumentationCreateMutation(DjangoCreateMutation):
    class Meta:
        model = Documentation
        only_fields = (
            "course",
            "lesson_event",
            "subject",
            "topic",
            "homework",
            "group_note",
            "datetime_start",
            "datetime_end",
            "date_start",
            "date_end",
        )
        optional_fields = (
            "course",
            "lesson_event",
            "subject",
            "topic",
            "homework",
            "group_note",
            "datetime_start",
            "datetime_end",
            "date_start",
            "date_end",
        )
        permissions = ("alsijil.add_documentation",)  # FIXME


class DocumentationBatchCreateMutation(DjangoBatchCreateMutation):
    class Meta:
        model = Documentation
        only_fields = (
            "id",
            "course",
            "lesson_event",
            "subject",
            "topic",
            "homework",
            "group_note",
            "datetime_start",
            "datetime_end",
            "date_start",
            "date_end",
        )
        permissions = ("alsijil.add_documentation",)  # FIXME


class DocumentationDeleteMutation(DeleteMutation):
    klass = Documentation
    permission_required = "alsijil.delete_documentation_rule"  # FIXME


class DocumentationBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
    class Meta:
        model = Documentation
        only_fields = (
            "id",
            "course",
            "lesson_event",
            "subject",
            "topic",
            "homework",
            "group_note",
            "datetime_start",
            "datetime_end",
            "date_start",
            "date_end",
        )
        permissions = ("alsijil.edit_documentation_rule",)  # FIXME