from typing import ClassVar

from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.views import View


class TabedViewMixin(View):
    """Basic functions for displaying tabs in the template."""

    current_tab: ClassVar[str | None] = None
    list_of_tabs: ClassVar[list | None] = None
    tabs_title: ClassVar[str | None] = None

    def get_tabs_title(self):
        if not self.tabs_title:
            raise ImproperlyConfigured("tabs_title is required")
        return self.tabs_title

    def get_current_tab(self):
        if not self.current_tab:
            raise ImproperlyConfigured("current_tab is required")
        return self.current_tab

    def get_list_of_tabs(self):
        if not self.list_of_tabs:
            raise ImproperlyConfigured("list_of_tabs is required")
        return self.list_of_tabs

    def get_context_data(self, **kwargs):
        kwargs = super().get_context_data(**kwargs)
        kwargs["tabs_title"] = self.get_tabs_title()
        kwargs["current_tab"] = self.get_current_tab()
        kwargs["list_of_tabs"] = self.get_list_of_tabs()
        return kwargs


class QuickNotifMixin:
    quick_notif_list = []

    def dispatch(self, request, *arg, **kwargs):
        # In some cases, the class can stay instanciated, so we need to reset the list
        self.quick_notif_list = []
        return super().dispatch(request, *arg, **kwargs)

    def get_success_url(self):
        ret = super().get_success_url()
        if hasattr(self, "quick_notif_url_arg"):
            if "?" in ret:
                ret += "&" + self.quick_notif_url_arg
            else:
                ret += "?" + self.quick_notif_url_arg
        return ret

    def get_context_data(self, **kwargs):
        """Add quick notifications to context."""
        kwargs = super().get_context_data(**kwargs)
        kwargs["quick_notifs"] = []
        for n in self.quick_notif_list:
            kwargs["quick_notifs"].append(settings.SITH_QUICK_NOTIF[n])
        for key, val in settings.SITH_QUICK_NOTIF.items():
            for gk in self.request.GET:
                if key == gk:
                    kwargs["quick_notifs"].append(val)
        return kwargs


class AllowFragment:
    """Add `is_fragment` to templates. It's only True if the request is emitted by htmx"""

    def get_context_data(self, **kwargs):
        kwargs["is_fragment"] = self.request.headers.get("HX-Request", False)
        return super().get_context_data(**kwargs)