from typing import Type

from django.core.cache import cache
from django.http.request import HttpRequest
from wagtail.models import Page


class SingletonPageCache:
    @classmethod
    def get_url_cache_key(cls, model: Type[Page]) -> str:
        return f"singleton_url_{model.__name__}"

    @classmethod
    def get_url(
        cls, model: Type[Page], request: HttpRequest | None = None
    ) -> str | None:
        cache_key = cls.get_url_cache_key(model)

        url = cache.get(cache_key)

        if url is None:
            # `.first` is marginally more efficient than `.get`
            page = Page.objects.type(model).first()

            if page is None:
                return None

            url = page.get_url(request)

            cache.set(cache_key, url, 10800)

        return url