"""
Forms module for the users app.
"""
from django import forms
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.forms import UserCreationForm

from allauth.account.forms import SignupForm

from usuarios.models import PerfilUser

from .models import User


class NewUserForm(SignupForm):
    """
    Form used to sign up a users.
    """

    field_order = ["full_name"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["full_name"] = forms.CharField(label=_("Full name"))
        self.fields.move_to_end("full_name", last=False)

    def clean_email(self):
        """
        Check if the provided email is already in use.
        """
        user_model = get_user_model()
        email = self.cleaned_data["email"]

        if user_model.objects.filter(email=email).exists():
            raise ValidationError("Email already in use.")

        return email


class UserForm(forms.ModelForm):
    """
    Form for user profile.
    """

    foto_perfil = forms.ImageField(
        required=False,
        label="Photo profile",
    )
    password = forms.CharField(required=False, widget=forms.PasswordInput())

    class Meta:
        model = User
        fields = [
            "full_name",
            "email",
        ]

    def save(self, commit=True):
        user = super().save(commit=False)

        password = self.cleaned_data["password"]
        if password:
            user.set_password(password)

        photo = self.cleaned_data["foto_perfil"]
        if photo:
            try:
                perfil = user.perfiluser
            except PerfilUser.DoesNotExist:
                perfil = PerfilUser.objects.create(user=user)

            perfil.foto_perfil = photo
            perfil.save()

        if commit:
            user.save()

        return user
