from django import forms
from django.forms.models import inlineformset_factory
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from .models import Election, Option, Question


class ElectionCreateForm(forms.ModelForm):
    def clean(self):
        cleaned_data = super().clean()
        if cleaned_data["start_date"] < timezone.now():
            self.add_error(
                "start_date", _("Impossible de faire débuter l'élection dans le passé")
            )
        elif cleaned_data["start_date"] >= cleaned_data["end_date"]:
            self.add_error(
                "end_date", _("Impossible de terminer l'élection avant de la commencer")
            )
        return cleaned_data

    class Meta:
        model = Election
        fields = ["name", "description", "start_date", "end_date"]


class VoteForm(forms.ModelForm):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # We set the option's text as the label for the checkbox
        instance = kwargs.get("instance", None)
        if instance is not None:
            self.fields["selected"].label = instance.text

    selected = forms.BooleanField(required=False)

    def record_vote(self, user):
        self.full_clean()
        if self.cleaned_data["selected"]:
            self.instance.voters.add(user)
        else:
            self.instance.voters.remove(user)

    class Meta:
        model = Option
        fields = []


OptionFormSet = inlineformset_factory(
    Question, Option, extra=0, form=VoteForm, can_delete=False
)
