from captcha.fields import ReCaptchaField
from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.forms.models import BaseInlineFormSet, inlineformset_factory

from petitscours.models import PetitCoursAbility, PetitCoursDemande


class BaseMatieresFormSet(BaseInlineFormSet):
    def clean(self):
        super().clean()
        if any(self.errors):
            # Don't bother validating the formset unless each form is
            # valid on its own
            return
        matieres = []
        for i in range(0, self.total_form_count()):
            form = self.forms[i]
            if not form.cleaned_data:
                continue
            matiere = form.cleaned_data["matiere"]
            niveau = form.cleaned_data["niveau"]
            delete = form.cleaned_data["DELETE"]
            if not delete and (matiere, niveau) in matieres:
                raise forms.ValidationError(
                    "Vous ne pouvez pas vous inscrire deux fois pour la "
                    "même matiere avec le même niveau."
                )
            matieres.append((matiere, niveau))


class DemandeForm(ModelForm):
    captcha = ReCaptchaField(attrs={"theme": "clean", "lang": "fr"})

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["matieres"].help_text = ""

    class Meta:
        model = PetitCoursDemande
        fields = (
            "name",
            "email",
            "phone",
            "quand",
            "freq",
            "lieu",
            "matieres",
            "agrege_requis",
            "niveau",
            "remarques",
        )
        widgets = {"matieres": forms.CheckboxSelectMultiple}


MatieresFormSet = inlineformset_factory(
    User,
    PetitCoursAbility,
    fields=("matiere", "niveau", "agrege"),
    formset=BaseMatieresFormSet,
)