"""
Views module for the users app.
"""
from django.conf import settings
from django.urls import reverse
from django.urls import reverse_lazy
from django.contrib.auth import login
from django.views.generic import FormView
from django.views.generic import UpdateView
from django.contrib.auth.views import LoginView as AuthLoginView

from allauth.utils import generate_unique_username

from .forms import UserForm
from .forms import NewUserForm
from .mails import welcome_email
from .models import User


class LoginView(AuthLoginView):
    """
    Login page view.
    """

    template_name = "users/login.html"


class RegisterView(FormView):
    """
    Register page view.
    """

    template_name = "users/register.html"
    form_class = NewUserForm
    success_url = reverse_lazy(settings.LOGIN_REDIRECT_URL)

    def form_valid(self, form):
        form.cleaned_data["username"] = generate_unique_username(
            [form.cleaned_data["email"]],
        )
        user = form.save(self.request)
        user.full_name = form.cleaned_data["full_name"]
        user.save()

        login(self.request, user, "django.contrib.auth.backends.ModelBackend")
        welcome_email(user)

        return super().form_valid(form)


class AccountView(UpdateView):
    """
    User account view.
    """

    template_name = "users/account.html"
    form_class = UserForm
    model = User

    def get_object(self, queryset=None):
        return self.request.user

    def get_success_url(self, **kwargs):
        return reverse("users:account")
