from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils import timezone

from reviews.models import Invite


@login_required
def list_invites(request):
    pending = Invite.objects.filter(
        invitee_email=request.user.email.lower(), status="pending"
    )
    return render(request, "invites/list.html", {"invites": pending})


@login_required
def accept(request, code):
    invite = get_object_or_404(Invite, code=code)
    if invite.invitee_email.lower() != request.user.email.lower():
        messages.error(request, "Este convite não é para sua conta.")
        return redirect("reviews:index")
    if invite.status != "pending":
        messages.warning(request, "Este convite não é mais válido.")
        return redirect("reviews:index")

    review = invite.review
    if not review.co_authors.filter(pk=request.user.pk).exists() and review.owner_id != request.user.id:
        review.co_authors.add(request.user)
    invite.status = "accepted"
    invite.invitee = request.user
    invite.responded_at = timezone.now()
    invite.save()
    messages.success(request, f"Você entrou na revisão '{review.title}'.")
    return redirect(reverse("reviews:detail", kwargs={"review_id": review.id}))


@login_required
def decline(request, code):
    invite = get_object_or_404(Invite, code=code)
    if invite.invitee_email.lower() != request.user.email.lower():
        messages.error(request, "Este convite não é para sua conta.")
        return redirect("reviews:index")
    invite.status = "declined"
    invite.responded_at = timezone.now()
    invite.save()
    messages.info(request, "Convite recusado.")
    return redirect("invites:list")
