"""Presentación de las respuestas 404 del navegador."""

from django.conf import settings
from django.http import HttpResponse
from inertia import render


def page(request, exception=None, *, debug_document: str | None = None) -> HttpResponse:
    """
    Rinde la pantalla 404 sin perder el informe técnico de desarrollo.

    El informe viaja como documento completo porque ésa es la única forma de
    conservar exactamente lo que Django hubiera mostrado, incluidas las rutas
    que intentó resolver. Nunca se agrega fuera de desarrollo: además de no
    servirle a quien usa el producto, enumera superficie interna de la app.
    """
    response = render(
        request,
        'NotFound',
        props={'debug_document': debug_document if settings.DEBUG else None},
    )
    response.status_code = 404
    return response


def debug_not_found_middleware(get_response):
    """Reviste el 404 técnico que Django produce cuando ``DEBUG`` está activo."""

    def middleware(request):
        response = get_response(request)

        if not settings.DEBUG or response.status_code != 404:
            return response
        if not response.headers.get('Content-Type', '').startswith('text/html'):
            return response

        debug_document = response.content.decode(response.charset or 'utf-8', errors='replace')
        return page(request, debug_document=debug_document)

    return middleware
