# core/exception_handler.py
"""Custom DRF-Exception-Handler.

Standardmäßig behandelt DRF nur APIException/Http404/PermissionDenied.
Jeder andere Fehler (KeyError, AttributeError, IntegrityError, ...) fällt
durch zu Djangos Handler und liefert die nackte HTML-Seite
"Server Error (500)" — auch bei einem authentifizierten API-Request.

Dieser Handler fängt solche Fehler ab, loggt sie immer mit vollem
Traceback und gibt bei DEBUG=True eine JSON-Antwort mit den Details zurück.
Bei DEBUG=False bleibt die Antwort bewusst nichtssagend (kein Leak).
"""
import logging
import traceback

from django.conf import settings
from rest_framework.response import Response
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status

logger = logging.getLogger('api.errors')


def api_exception_handler(exc, context):
    response = drf_exception_handler(exc, context)

    if response is not None:
        # Von DRF bereits sauber behandelt (400/401/403/404/...)
        return response

    view = context.get('view')
    request = context.get('request')
    logger.error(
        'Unbehandelte Exception in %s (%s %s)',
        view.__class__.__name__ if view else '?',
        getattr(request, 'method', '?'),
        getattr(request, 'path', '?'),
        exc_info=exc,
    )

    if not settings.DEBUG:
        return None  # DRF re-raised → Djangos 500-Handling

    return Response(
        {
            'error': exc.__class__.__name__,
            'detail': str(exc),
            'view': view.__class__.__name__ if view else None,
            'path': getattr(request, 'path', None),
            'traceback': traceback.format_exception(type(exc), exc, exc.__traceback__),
        },
        status=status.HTTP_500_INTERNAL_SERVER_ERROR,
    )
