from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.core.exceptions import ValidationError

from .models import ReyMotaUser


class ReyMotaUserCreationForm(UserCreationForm):
    invitation_code = forms.CharField(
        max_length=32,
        label="Código de Invitación",
        help_text="Introduce el código que has recibido"
    )

    class Meta:
        model = ReyMotaUser
        fields = ("email", "nombre", "foto", "invitation_code")
        labels = {'email': 'Dirección de correo'}

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        code = self.initial.get('invitation_code')
        if code:
            self.fields['invitation_code'].initial = code

    def clean_invitation_code(self):
        code = self.cleaned_data.get('invitation_code')
        if not code:
            raise ValidationError("El código de invitación es obligatorio.")

        from accounts.models import InvitationCode
        try:
            invitation = InvitationCode.objects.get(code=code)
            if not invitation.is_valid():
                if invitation.is_used:
                    raise ValidationError("Este código ya ha sido utilizado.")
                else:
                    raise ValidationError("El código ha expirado.")
        except InvitationCode.DoesNotExist:
            raise ValidationError("El código no es válido.")

        return code

    def save(self, commit=True):
        user = super().save(commit=False)
        if commit:
            user.save()
            code = self.cleaned_data.get('invitation_code')
            invitation = InvitationCode.objects.get(code=code)
            invitation.mark_as_used(user)
        return user


class ReyMotaUserChangeForm(UserChangeForm):

    class Meta:
        model = ReyMotaUser
        fields = ("email", "foto")