from django.contrib.auth.decorators import login_required
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse

from accounts.models import User
from reviews.models import Review

# Prefixos de URL do sistema — não são usernames de revisão
RESERVED_USERNAMES = frozenset(
    {"accounts", "reviews", "invites", "admin", "publico", "static", "media"}
)


def _get_review(request, username: str, review_slug: str) -> Review:
    if username.lower() in RESERVED_USERNAMES:
        raise Http404()
    owner = get_object_or_404(User, username=username)
    review = get_object_or_404(Review, owner_id=owner.id, slug=review_slug)
    if not review.is_author(request.user):
        raise Http404()
    return review


@login_required
def review_home(request, username, review_slug):
    review = _get_review(request, username, review_slug)
    return redirect(reverse("reviews:detail", kwargs={"review_id": review.id}))


@login_required
def planning_home(request, username, review_slug):
    review = _get_review(request, username, review_slug)
    return redirect(reverse("planning:index", kwargs={"review_id": review.id}))


@login_required
def conducting_home(request, username, review_slug):
    review = _get_review(request, username, review_slug)
    return redirect(reverse("conducting:index", kwargs={"review_id": review.id}))


@login_required
def reporting_home(request, username, review_slug):
    review = _get_review(request, username, review_slug)
    return redirect(reverse("reporting:index", kwargs={"review_id": review.id}))
