from django.contrib import auth, messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, render
from django.urls import reverse
from urllib.parse import urlparse

from accounts.forms import LoginForm, SignupForm
from accounts.models import User
from rsl.services.slug import unique_username


def _safe_redirect_url(request, target: str | None) -> str | None:
    if not target:
        return None
    login_path = reverse("accounts:login")
    signup_path = reverse("accounts:signup")
    ref_url = urlparse(request.build_absolute_uri("/"))
    test_url = urlparse(target)
    path = test_url.path if test_url.scheme else target.split("?")[0]
    if path.startswith(login_path) or path.startswith(signup_path):
        return None
    if test_url.scheme in ("http", "https") and ref_url.netloc == test_url.netloc:
        return target
    if target.startswith("/"):
        return target
    return None


def signup(request):
    if request.user.is_authenticated:
        return redirect("reviews:index")

    form = SignupForm(request.POST or None)
    if request.method == "POST" and form.is_valid():
        user = User(
            name=form.cleaned_data["name"].strip(),
            username=unique_username(
                form.cleaned_data["name"].strip(),
                form.cleaned_data["email"].lower().strip(),
            ),
            email=form.cleaned_data["email"].lower().strip(),
        )
        user.set_password(form.cleaned_data["password"])
        user.save()
        auth.login(request, user, backend="accounts.backends.EmailWerkzeugBackend")
        messages.success(request, "Bem-vindo ao InnoRSL! Sua conta foi criada.")
        return redirect("reviews:index")

    return render(request, "auth/signup.html", {"form": form})


def login_view(request):
    if request.user.is_authenticated:
        return redirect("reviews:index")

    form = LoginForm(request.POST or None)
    if request.method == "POST" and form.is_valid():
        user = auth.authenticate(
            request,
            email=form.cleaned_data["email"].lower().strip(),
            password=form.cleaned_data["password"],
        )
        if user is None:
            messages.error(request, "E-mail ou senha inválidos.")
            return render(request, "auth/login.html", {"form": form})

        auth.login(request, user, backend="accounts.backends.EmailWerkzeugBackend")
        messages.success(request, "Login realizado com sucesso.")
        next_page = _safe_redirect_url(request, request.GET.get("next")) or reverse("reviews:index")
        return redirect(next_page)

    return render(request, "auth/login.html", {"form": form})


@login_required
def logout_view(request):
    auth.logout(request)
    messages.info(request, "Você saiu da sua conta.")
    return redirect("core:home")
