from django.contrib import messages
from django.shortcuts import redirect, render
from django.urls import reverse_lazy
from django.views import View

from .crud import BaseCreateView, BaseDeleteView, BaseUpdateView
from .manage_forms import PageForm, ServiceForm, SiteSettingsForm
from .mixins import AdminRequiredMixin, EditeurRequiredMixin
from .models import Page, Service, SiteSettings


class SettingsView(AdminRequiredMixin, View):
    def get(self, request):
        return self.render(SiteSettingsForm(instance=SiteSettings.load()))

    def post(self, request):
        form = SiteSettingsForm(request.POST, request.FILES, instance=SiteSettings.objects.get_or_create(pk=1)[0])
        if form.is_valid():
            form.save()
            messages.success(request, "Paramètres enregistrés.")
            return redirect("siteconfig:settings")
        messages.error(request, "Certains champs sont invalides.")
        return self.render(form, status=400)

    def render(self, form, status=200):
        return render(self.request, "backoffice/core/settings.html", {"form": form}, status=status)


class PageListView(EditeurRequiredMixin, View):
    def get(self, request):
        return render(request, "backoffice/core/pages.html", {"pages": Page.objects.all()})


class PageCreateView(EditeurRequiredMixin, BaseCreateView):
    model = Page
    form_class = PageForm
    page_title = "Nouvelle page"
    back_url = reverse_lazy("siteconfig:page-list")
    rich_text = True
    wide_fields = ("titre", "chapo", "contenu")
    success_message = "Page « %(titre)s » créée."


class PageUpdateView(EditeurRequiredMixin, BaseUpdateView):
    model = Page
    form_class = PageForm
    back_url = reverse_lazy("siteconfig:page-list")
    rich_text = True
    wide_fields = ("titre", "chapo", "contenu")
    success_message = "Page « %(titre)s » enregistrée."


class PageDeleteView(AdminRequiredMixin, BaseDeleteView):
    model = Page
    success_url = reverse_lazy("siteconfig:page-list")
    success_message = "Page supprimée."


class ServiceListView(EditeurRequiredMixin, View):
    def get(self, request):
        return render(request, "backoffice/core/services.html", {"services": Service.objects.all()})


class ServiceCreateView(EditeurRequiredMixin, BaseCreateView):
    model = Service
    form_class = ServiceForm
    page_title = "Nouveau service"
    back_url = reverse_lazy("siteconfig:service-list")
    success_message = "Service ajouté."


class ServiceUpdateView(EditeurRequiredMixin, BaseUpdateView):
    model = Service
    form_class = ServiceForm
    back_url = reverse_lazy("siteconfig:service-list")


class ServiceDeleteView(EditeurRequiredMixin, BaseDeleteView):
    model = Service
    success_url = reverse_lazy("siteconfig:service-list")
    success_message = "Service supprimé."
