from django.core.paginator import Paginator
from django.db.models import F
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse_lazy
from django.views import View

from apps.core.crud import BaseCreateView, BaseDeleteView, BaseUpdateView
from apps.core.mixins import EditeurRequiredMixin

from .forms import PubliciteForm
from .models import Publicite


class AdListView(EditeurRequiredMixin, View):
    def get(self, request):
        qs = Publicite.objects.select_related("image")
        if pos := request.GET.get("position"):
            qs = qs.filter(position=pos)
        page = Paginator(qs, 15).get_page(request.GET.get("page"))
        return render(request, "backoffice/ads/list.html", {"page_obj": page, "positions": Publicite.Position.choices})


class AdFormMixin(EditeurRequiredMixin):
    model = Publicite
    form_class = PubliciteForm
    template_name = "backoffice/ads/form.html"
    back_url = reverse_lazy("ads:list")


class AdCreateView(AdFormMixin, BaseCreateView):
    page_title = "Nouvelle publicité"
    success_message = "Publicité « %(titre)s » créée."


class AdUpdateView(AdFormMixin, BaseUpdateView):
    success_message = "Publicité « %(titre)s » mise à jour."


class AdToggleView(EditeurRequiredMixin, View):
    def post(self, request, pk):
        ad = get_object_or_404(Publicite, pk=pk)
        ad.actif = not ad.actif
        ad.save(update_fields=["actif", "updated_at"])
        return redirect("ads:list")


class AdDeleteView(EditeurRequiredMixin, BaseDeleteView):
    model = Publicite
    success_url = reverse_lazy("ads:list")
    success_message = "Publicité supprimée (le visuel reste dans la médiathèque)."


def ad_click(request, pk):
    """Compte le clic puis redirige vers l'annonceur."""
    ad = get_object_or_404(Publicite, pk=pk)
    if not ad.lien:
        return redirect("public:home")
    Publicite.objects.filter(pk=pk).update(clics=F("clics") + 1)
    return redirect(ad.lien)
