from django import forms
from django.contrib.auth.models import User
from .models import (
    School, Participant, Item, ParticipantItem, GroupEntry, GroupMember,
    PointRule, AcademicYear, SystemSetting
)

class SchoolForm(forms.ModelForm):
    class Meta:
        model = School
        exclude = ["confirmed", "confirmed_at"]

class ParticipantForm(forms.ModelForm):
    class Meta:
        model = Participant
        fields = ["admission_no", "name", "sex", "age", "section", "class_name"]

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ["code", "name", "section", "sex", "participation_type",
                  "min_participants", "max_participants", "active"]

class PointRuleForm(forms.ModelForm):
    class Meta:
        model = PointRule
        fields = ["first", "second", "third"]

class AcademicYearForm(forms.ModelForm):
    class Meta:
        model = AcademicYear
        fields = ["name", "active"]

class UserCreateForm(forms.Form):
    ROLE_CHOICES = [
        ("school", "School User"),
        ("result", "Result Entry User"),
        ("admin", "Admin User"),
    ]
    username = forms.CharField(max_length=150)
    password = forms.CharField(widget=forms.PasswordInput)
    role = forms.ChoiceField(choices=ROLE_CHOICES)
    school = forms.ModelChoiceField(queryset=School.objects.all(), required=False)

    def clean(self):
        cleaned = super().clean()
        role = cleaned.get("role")
        username = cleaned.get("username")
        school = cleaned.get("school")
        if username and User.objects.filter(username=username).exists():
            raise forms.ValidationError("Username already exists.")
        if role == "school":
            if not school:
                raise forms.ValidationError("Select a school.")
            if username != school.code:
                raise forms.ValidationError("School User username must equal the School Code.")
        return cleaned

class UserPasswordForm(forms.Form):
    user = forms.ModelChoiceField(queryset=User.objects.all())
    password = forms.CharField(widget=forms.PasswordInput)

class StageInputForm(forms.Form):
    item = forms.ModelChoiceField(queryset=Item.objects.filter(active=True))
