from django import forms
from django.contrib.auth.models import User, Group
from dal import autocomplete
from .models import School, CotisationHistory, WhiteListHistory, BanishmentHistory
from preferences.models import PaymentMethod

class LoginForm(forms.Form):
    """
    Form to log in.
    """
    username = forms.CharField(max_length=255, label="Nom d'utitisateur")
    password = forms.CharField(max_length=255, widget=forms.PasswordInput, label="Mot de passe")

class CreateUserForm(forms.ModelForm):
    """
    Form to create a new user (:class:`django.contrib.auth.models.User`).
    """
    class Meta:
        model = User
        fields = ("username", "last_name", "first_name", "email")

    school = forms.ModelChoiceField (queryset=School.objects.all(), label="École")

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(CreateUserForm, self).__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super().clean()
        email = cleaned_data.get("email")
        if User.objects.filter(email=email).count() > 0:
            if User.objects.filter(email=email).count() == 1 and User.objects.get(email=email) == self.user:
                pass
            else:
                raise forms.ValidationError("L'adresse email est déjà utilisée")

class CreateGroupForm(forms.ModelForm):
    """
    Form to create a new group (:class:`django.contrib.auth.models.Group`).
    """
    class Meta:
        model = Group
        fields = ("name", )

class EditGroupForm(forms.ModelForm):
    """
    Form to edit a group (:class:`django.contrib.auth.models.Group`).
    """
    class Meta:
        model = Group
        fields = "__all__"

class SelectUserForm(forms.Form):
    """
    Form to select a user from all users (:class:`django.contrib.auth.models.User`).
    """
    user = forms.ModelChoiceField(queryset=User.objects.all(), required=True, label="Utilisateur", widget=autocomplete.ModelSelect2(url='users:all-users-autocomplete', attrs={'data-minimum-input-length':2}))

class SelectNonSuperUserForm(forms.Form):
    """
    Form to select a user from all non-superuser users (:class:`django.contrib.auth.models.User`).
    """ 
    user = forms.ModelChoiceField(queryset=User.objects.filter(is_active=True), required=True, label="Utilisateur", widget=autocomplete.ModelSelect2(url='users:non-super-users-autocomplete', attrs={'data-minimum-input-length':2}))

class SelectNonAdminUserForm(forms.Form):
    """
    Form to select a user from all non-staff users (:class:`django.contrib.auth.models.User`).
    """
    user = forms.ModelChoiceField(queryset=User.objects.filter(is_active=True), required=True, label="Utilisateur", widget=autocomplete.ModelSelect2(url='users:non-admin-users-autocomplete', attrs={'data-minimum-input-length':2}))

class GroupsEditForm(forms.ModelForm):
    """
    Form to edit a user's list of groups (:class:`django.contrib.auth.models.User` and :class:`django.contrib.auth.models.Group`).
    """
    class Meta:
        model = User
        fields = ("groups", )

class EditPasswordForm(forms.Form):
    """
    Form to change the password of a user (:class:`django.contrib.auth.models.User`).
    """
    password = forms.CharField(max_length=255, widget=forms.PasswordInput, label="Mot de passe actuel")
    password1 = forms.CharField(max_length=255, widget=forms.PasswordInput, label="Nouveau mot de passe")
    password2 = forms.CharField(max_length=255, widget=forms.PasswordInput, label="Nouveau mot de passe (répétez)")

    def clean_password2(self):
        """
        Verify if the two new passwords are identical
        """
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Les mots de passe ne sont pas identiques")
        return password2

class addCotisationHistoryForm(forms.ModelForm):
    """
    Form to add a :class:`users.models.CotisationHistory` to user (:class:`django.contrib.auth.models.User`).
    """
    def __init__(self, *args, **kwargs):
        super(addCotisationHistoryForm, self).__init__(*args, **kwargs)
        self.fields['paymentMethod'].queryset = PaymentMethod.objects.filter(is_usable_in_cotisation=True).filter(is_active=True)

    class Meta:
        model = CotisationHistory
        fields = ("cotisation", "paymentMethod")

class addWhiteListHistoryForm(forms.ModelForm):
    """
    Form to add a :class:`users.models.WhiteListHistory` to user (:class:`django.contrib.auth.models.User`).
    """
    class Meta:
        model = WhiteListHistory
        fields = ("duration", "reason")


class addBanishmentHistoryForm(forms.ModelForm):
    """
    Form to add a :class:`users.models.BanishmentHistory` to user (:class:`django.contrib.auth.models.User`).
    """
    class Meta:
        model = BanishmentHistory
        fields = ("end_date", "reason")

class SchoolForm(forms.ModelForm):
    """
    Form to add and edit a :class:`users.models.School`.
    """
    class Meta:
        model = School
        fields = "__all__"

class ExportForm(forms.Form):
    """
    Form to export list of users (:class:`django.contrib.auth.models.User`) to csv file
    """
    QUERY_TYPE_CHOICES = (
        ('all', 'Tous les comptes'),
        ('all_active', 'Tous les comptes actifs'),
        ('adherent', 'Tous les adhérents'),
        ('adherent_active', 'Tous les adhérents actifs')
    )

    FIELDS_CHOICES = (
        ('username', 'Nom d\'utilisateur'),
        ('last_name', 'Nom'),
        ('first_name', 'Prénom'),
        ('email', 'Adresse mail'),
        ('school', 'École'),
        ('balance', 'Solde'),
        ('credit', 'Crédit'),
        ('debit', 'Débit')
    )
    query_type = forms.ChoiceField(choices=QUERY_TYPE_CHOICES, label="Ensemble de la demande")
    fields = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=FIELDS_CHOICES, label="Champs")
    group = forms.ModelChoiceField(queryset=Group.objects.all(), empty_label="Tous les groupes", required=False, label="Groupe")