# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later

from bootstrap_datepicker_plus.widgets import DatePickerInput
from django import forms
from django.contrib.auth.models import User
from django.db.models import Q
from django.forms import CheckboxSelectMultiple, RadioSelect
from django.utils.translation import gettext_lazy as _
from note.models import NoteSpecial, NoteUser
from note_kfet.inputs import AmountInput, Autocomplete, ColorWidget

from ..models import WEIClub, WEIRegistration, Bus, BusTeam, WEIMembership, WEIRole


class WEIForm(forms.ModelForm):
    class Meta:
        model = WEIClub
        exclude = ('parent_club', 'require_memberships', 'membership_duration', )
        widgets = {
            "membership_fee_paid": AmountInput(),
            "membership_fee_unpaid": AmountInput(),
            "membership_start": DatePickerInput(),
            "membership_end": DatePickerInput(),
            "date_start": DatePickerInput(),
            "date_end": DatePickerInput(),
            "deposit_amount": AmountInput(),
            "fee_soge_credit": AmountInput(),
        }


class WEIRegistrationForm(forms.ModelForm):
    def clean(self):
        cleaned_data = super().clean()

        if 'user' in cleaned_data:
            if not NoteUser.objects.filter(user=cleaned_data['user']).exists():
                self.add_error('user', _("The selected user is not validated. Please validate its account first"))

        return cleaned_data

    class Meta:
        model = WEIRegistration
        fields = [
            'user', 'soge_credit', 'birth_date', 'gender', 'clothing_size',
            'health_issues', 'emergency_contact_name', 'emergency_contact_phone',
            'first_year', 'information_json', 'deposit_given', 'deposit_type'
        ]
        widgets = {
            "user": Autocomplete(
                User,
                attrs={
                    'api_url': '/api/user/',
                    'name_field': 'username',
                    'placeholder': 'Nom ...',
                },
            ),
            "birth_date": DatePickerInput(options={
                'minDate': '1900-01-01',
                'maxDate': '2100-01-01'
            }),
            "deposit_given": forms.CheckboxInput(
                attrs={'class': 'form-check-input'},
            ),
            "deposit_type": forms.RadioSelect(),
        }


class WEIChooseBusForm(forms.Form):
    bus = forms.ModelMultipleChoiceField(
        queryset=Bus.objects,
        label=_("Bus"),
        help_text=_("This choice is not definitive. The WEI organizers are free to attribute for you a bus and a team,"
                    + " in particular if you are a free eletron."),
        widget=CheckboxSelectMultiple(),
    )

    team = forms.ModelMultipleChoiceField(
        queryset=BusTeam.objects,
        label=_("Team"),
        required=False,
        help_text=_("Leave this field empty if you won't be in a team (staff, bus chief, free electron)"),
        widget=CheckboxSelectMultiple(),
    )

    roles = forms.ModelMultipleChoiceField(
        queryset=WEIRole.objects.filter(~Q(name="1A") & ~Q(name="GC WEI")),
        label=_("WEI Roles"),
        help_text=_("Select the roles that you are interested in."),
        initial=WEIRole.objects.filter(Q(name="Adhérent⋅e WEI") | Q(name="\u00c9lectron libre")).all(),
        widget=CheckboxSelectMultiple(),
    )


class WEIMembershipForm(forms.ModelForm):
    roles = forms.ModelMultipleChoiceField(
        queryset=WEIRole.objects.filter(~Q(name="GC WEI")),
        label=_("WEI Roles"),
        widget=CheckboxSelectMultiple(),
    )

    credit_type = forms.ModelChoiceField(
        queryset=NoteSpecial.objects.all(),
        label=_("Credit type"),
        empty_label=_("No credit"),
        required=False,
    )

    credit_amount = forms.IntegerField(
        label=_("Credit amount"),
        widget=AmountInput(),
        initial=0,
        required=False,
    )

    last_name = forms.CharField(
        label=_("Last name"),
        required=False,
    )

    first_name = forms.CharField(
        label=_("First name"),
        required=False,
    )

    bank = forms.CharField(
        label=_("Bank"),
        required=False,
    )

    def __init__(self, *args, wei=None, **kwargs):
        super().__init__(*args, **kwargs)
        if 'bus' in self.fields:
            if wei is not None:
                self.fields['bus'].queryset = Bus.objects.filter(wei=wei)
            else:
                self.fields['bus'].queryset = Bus.objects.none()
        if 'team' in self.fields:
            if wei is not None:
                self.fields['team'].queryset = BusTeam.objects.filter(bus__wei=wei)
            else:
                self.fields['team'].queryset = BusTeam.objects.none()

    def clean(self):
        cleaned_data = super().clean()
        if 'team' in cleaned_data and cleaned_data["team"] is not None \
                and cleaned_data["team"].bus != cleaned_data["bus"]:
            self.add_error('bus', _("This team doesn't belong to the given bus."))
        return cleaned_data

    class Meta:
        model = WEIMembership
        fields = ('roles', 'bus', 'team',)
        widgets = {
            "bus": RadioSelect(),
            "team": RadioSelect(),
        }


class WEIMembership1AForm(WEIMembershipForm):
    """
    Used to confirm registrations of first year members without choosing a bus now.
    """
    deposit_given = None
    roles = None

    def clean(self):
        return super(forms.ModelForm, self).clean()

    class Meta:
        model = WEIMembership
        fields = ('credit_type', 'credit_amount', 'last_name', 'first_name', 'bank',)


class BusForm(forms.ModelForm):
    class Meta:
        model = Bus
        fields = '__all__'
        widgets = {
            "wei": Autocomplete(
                WEIClub,
                attrs={
                    'api_url': '/api/wei/club/',
                    'placeholder': 'WEI ...',
                },
            ),
        }


class BusTeamForm(forms.ModelForm):
    class Meta:
        model = BusTeam
        fields = '__all__'
        widgets = {
            "bus": Autocomplete(
                Bus,
                attrs={
                    'api_url': '/api/wei/bus/',
                    'placeholder': 'Bus ...',
                },
            ),
            "color": ColorWidget(),
        }
