from django.core.exceptions import PermissionDenied

from graphene_django import DjangoObjectType
from guardian.shortcuts import get_objects_for_user

from aleksis.apps.alsijil.models import ExtraMark
from aleksis.core.schema.base import (
    BaseBatchCreateMutation,
    BaseBatchDeleteMutation,
    BaseBatchPatchMutation,
    DjangoFilterMixin,
    OptimisticResponseTypeMixin,
    PermissionsTypeMixin,
)
from aleksis.core.util.core_helpers import has_person


class ExtraMarkType(
    OptimisticResponseTypeMixin,
    PermissionsTypeMixin,
    DjangoFilterMixin,
    DjangoObjectType,
):
    class Meta:
        model = ExtraMark
        fields = ("id", "short_name", "name", "colour_fg", "colour_bg", "show_in_coursebook")

    @classmethod
    def get_queryset(cls, queryset, info):
        if has_person(info.context.user):
            return get_objects_for_user(info.context.user, "alsijil.view_extramark", queryset)
        raise PermissionDenied()


class ExtraMarkBatchCreateMutation(BaseBatchCreateMutation):
    class Meta:
        model = ExtraMark
        fields = ("short_name", "name", "colour_fg", "colour_bg", "show_in_coursebook")
        optional_fields = ("name",)

    @classmethod
    def check_permissions(cls, root, info, input):  # noqa
        if info.context.user.has_perm("alsijil.add_extramark_rule"):
            return
        raise PermissionDenied()


class ExtraMarkBatchDeleteMutation(BaseBatchDeleteMutation):
    class Meta:
        model = ExtraMark

    @classmethod
    def check_permissions(cls, root, info, input):  # noqa
        if info.context.user.has_perm("alsijil.delete_extramark_rule"):
            return
        raise PermissionDenied()


class ExtraMarkBatchPatchMutation(BaseBatchPatchMutation):
    class Meta:
        model = ExtraMark
        fields = ("id", "short_name", "name", "colour_fg", "colour_bg", "show_in_coursebook")

    @classmethod
    def check_permissions(cls, root, info, input):  # noqa
        if info.context.user.has_perm("alsijil.edit_extramark_rule"):
            return
        raise PermissionDenied()