from django import forms
from django.utils.decorators import method_decorator
from django.views.generic import CreateView, DeleteView, ListView, UpdateView

from users.decorators import admin_required
from users.models import Announcement
from users.views.admin.generic import HTMXActionView


@method_decorator(admin_required, name="dispatch")
class AnnouncementsRoot(ListView):

    template_name = "admin/announcements.html"
    paginate_by = 30

    def get(self, request, *args, **kwargs):
        self.extra_context = {
            "section": "announcements",
        }
        return super().get(request, *args, **kwargs)

    def get_queryset(self):
        reports = Announcement.objects.order_by("created")
        return reports


@method_decorator(admin_required, name="dispatch")
class AnnouncementCreate(CreateView):

    model = Announcement
    template_name = "admin/announcement_create.html"
    extra_context = {"section": "announcements"}
    success_url = Announcement.urls.admin_root

    class form_class(forms.ModelForm):
        class Meta:
            model = Announcement
            fields = ["text", "published", "start", "end"]
            widgets = {
                "published": forms.Select(
                    choices=[(True, "Published"), (False, "Draft")]
                )
            }


@method_decorator(admin_required, name="dispatch")
class AnnouncementEdit(UpdateView):

    model = Announcement
    template_name = "admin/announcement_edit.html"
    extra_context = {"section": "announcements"}

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["page"] = self.request.GET.get("page")
        return context

    class form_class(AnnouncementCreate.form_class):
        pass


@method_decorator(admin_required, name="dispatch")
class AnnouncementDelete(DeleteView):

    model = Announcement
    template_name = "admin/announcement_delete.html"
    success_url = Announcement.urls.admin_root


class AnnouncementPublish(HTMXActionView):
    """
    Marks the announcement as published.
    """

    model = Announcement

    def action(self, announcement: Announcement):
        announcement.published = True
        announcement.save()


class AnnouncementUnpublish(HTMXActionView):
    """
    Marks the announcement as unpublished.
    """

    model = Announcement

    def action(self, announcement: Announcement):
        announcement.published = False
        announcement.save()
