"""Presentación de último recurso para los errores internos del navegador."""

import json
from functools import lru_cache
from pathlib import Path

from django.conf import settings
from django.http import HttpResponse
from django.template.loader import render_to_string

SUPPORTED_LANGUAGES = frozenset({'en', 'es-ar'})
SUPPORTED_THEMES = frozenset({'light', 'dark', 'system'})


def page(request) -> HttpResponse:
    """
    Rinde el 500 sin depender de aquello que puede haber provocado el error.

    No pasa por Inertia ni por los procesadores de contexto: ambos leen sesión,
    cuenta y preferencias, y una caída de base convertiría el propio salvavidas
    en otra excepción. El catálogo sí sigue siendo la fuente del texto, pero se
    lee como archivo estático y queda cacheado en memoria después del primer uso.
    """
    language = _cookie_choice(request, 'app_language', SUPPORTED_LANGUAGES, 'en')
    theme = _cookie_choice(request, 'app_theme', SUPPORTED_THEMES, 'system')
    catalog = _catalog(language)

    content = render_to_string(
        '500.html',
        {
            'language': language,
            'theme': theme,
            'retry_url': request.get_full_path(),
            'title': catalog['serverErrorPage.title'],
            'heading': catalog['serverErrorPage.heading'],
            'description': catalog['serverErrorPage.description'],
            'retry': catalog['serverErrorPage.retry'],
            'home': catalog['serverErrorPage.home'],
        },
        request=None,
    )
    response = HttpResponse(content, status=500)
    response.headers['Cache-Control'] = 'no-store'
    return response


@lru_cache(maxsize=len(SUPPORTED_LANGUAGES))
def _catalog(language: str) -> dict[str, str]:
    """Carga sólo el catálogo necesario, sin inicializar la aplicación web."""
    path = Path(settings.BASE_DIR) / 'frontend' / 'locales' / f'{language}.json'
    return json.loads(path.read_text(encoding='utf-8'))


def _cookie_choice(request, name: str, choices: frozenset[str], fallback: str) -> str:
    """Acepta una preferencia conocida y descarta cualquier valor inventado."""
    value = request.COOKIES.get(name, '')
    return value if value in choices else fallback
