""" book list views"""
from django.contrib.auth.decorators import login_required
from django.db.models import Max
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.views import View

from bookwyrm import forms, models
from bookwyrm.views.list.list import increment_order_in_reverse
from bookwyrm.views.list.list import normalize_book_list_ordering


# pylint: disable=no-self-use
@method_decorator(login_required, name="dispatch")
class Curate(View):
    """approve or discard list suggestsions"""

    def get(self, request, list_id):
        """display a pending list"""
        book_list = get_object_or_404(models.List, id=list_id)
        book_list.raise_not_editable(request.user)

        data = {
            "list": book_list,
            "pending": book_list.listitem_set.filter(approved=False),
            "list_form": forms.ListForm(instance=book_list),
        }
        return TemplateResponse(request, "lists/curate.html", data)

    def post(self, request, list_id):
        """edit a book_list"""
        book_list = get_object_or_404(models.List, id=list_id)
        book_list.raise_not_editable(request.user)

        suggestion = get_object_or_404(models.ListItem, id=request.POST.get("item"))
        approved = request.POST.get("approved") == "true"
        if approved:
            # update the book and set it to be the last in the order of approved books,
            # before any pending books
            suggestion.approved = True
            order_max = (
                book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[
                    "order__max"
                ]
                or 0
            ) + 1
            suggestion.order = order_max
            increment_order_in_reverse(book_list.id, order_max)
            suggestion.save()
        else:
            deleted_order = suggestion.order
            suggestion.delete(broadcast=False)
            normalize_book_list_ordering(book_list.id, start=deleted_order)
        return redirect("list-curate", book_list.id)