from django import forms
from django.contrib.auth.models import Group, User

from .fields import KFetPermissionsField


class GroupForm(forms.ModelForm):
    permissions = KFetPermissionsField()

    def clean_name(self):
        name = self.cleaned_data["name"]
        return "K-Fêt %s" % name

    def clean_permissions(self):
        kfet_perms = self.cleaned_data["permissions"]
        # TODO: With Django >=1.11, the QuerySet method 'difference' can be
        # used.
        # other_groups = self.instance.permissions.difference(
        #     self.fields['permissions'].queryset
        # )
        if self.instance.pk is None:
            return kfet_perms
        other_perms = self.instance.permissions.exclude(
            pk__in=[p.pk for p in self.fields["permissions"].queryset]
        )
        return list(kfet_perms) + list(other_perms)

    class Meta:
        model = Group
        fields = ["name", "permissions"]


class UserGroupForm(forms.ModelForm):
    groups = forms.ModelMultipleChoiceField(
        Group.objects.filter(name__icontains="K-Fêt"),
        label="Statut équipe",
        required=False,
    )

    def clean_groups(self):
        kfet_groups = self.cleaned_data.get("groups")
        if self.instance.pk is None:
            return kfet_groups
        other_groups = self.instance.groups.exclude(name__icontains="K-Fêt")
        return list(kfet_groups) + list(other_groups)

    class Meta:
        model = User
        fields = ["groups"]