"""Briques CRUD communes du back-office (création, modification, suppression)."""

from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin
from django.db.models import ProtectedError
from django.shortcuts import get_object_or_404, redirect
from django.views import View
from django.views.generic import CreateView, UpdateView


class FormPageMixin(SuccessMessageMixin):
    """Rend `backoffice/generic_form.html` avec titre, retour et champs en grille."""

    template_name = "backoffice/generic_form.html"
    page_title = ""
    back_url = ""
    submit_label = "Enregistrer"
    rich_text = False
    wide_fields = ()  # champs sur toute la largeur

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx.update(
            page_title=self.page_title or str(getattr(self, "object", "") or ""),
            back_url=self.back_url,
            submit_label=self.submit_label,
            rich_text=self.rich_text,
            wide_fields=self.wide_fields,
        )
        return ctx

    def get_success_url(self):
        return self.back_url



class BaseCreateView(FormPageMixin, CreateView):
    success_message = "Élément créé."


class BaseUpdateView(FormPageMixin, UpdateView):
    success_message = "Modifications enregistrées."


class BaseDeleteView(View):
    model = None
    success_url = ""
    success_message = "Élément supprimé."

    def check(self, obj):
        """Retourne un message d'erreur si la suppression est refusée."""
        return None

    def post(self, request, pk):
        obj = get_object_or_404(self.model, pk=pk)
        if error := self.check(obj):
            messages.error(request, error)
            return redirect(self.success_url)
        try:
            obj.delete()
        except ProtectedError:
            messages.error(request, "Suppression impossible : cet élément est encore utilisé.")
            return redirect(self.success_url)
        messages.success(request, self.success_message)
        return redirect(self.success_url)
