"""Централизованная обработка ошибок DRF: JSON при сбоях API вместо HTML."""

import logging

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import exception_handler

logger = logging.getLogger(__name__)


_RU_MAP = {
    "This field is required.": "Это поле обязательно.",
    "This field may not be blank.": "Поле не может быть пустым.",
    "This field may not be null.": "Поле не может быть null.",
    "Invalid data. Expected a dictionary, but got": "Некорректные данные. Ожидается объект, получено",
    "Invalid pk": "Некорректный идентификатор",
    "Not found.": "Объект не найден.",
    "No active account found with the given credentials": "Неверный email или пароль.",
    "Given token not valid for any token type": "Токен недействителен.",
    "Token is invalid or expired": "Токен недействителен или истёк.",
    "Authentication credentials were not provided.": "Учетные данные не предоставлены.",
    "You do not have permission to perform this action.": "Недостаточно прав для выполнения действия.",
}


def _to_ru(value):
    if isinstance(value, str):
        for en, ru in _RU_MAP.items():
            if value == en or value.startswith(en):
                return value.replace(en, ru, 1)
        return value
    if isinstance(value, list):
        return [_to_ru(v) for v in value]
    if isinstance(value, dict):
        return {k: _to_ru(v) for k, v in value.items()}
    return value


def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    if response is not None:
        if hasattr(response, "data"):
            response.data = _to_ru(response.data)
        return response

    request = context.get("request")
    if request and getattr(request, "path", "").startswith("/api/"):
        logger.exception("Необработанное исключение в API", exc_info=exc)
        return Response(
            {"detail": "Внутренняя ошибка сервера. Попробуйте позже."},
            status=status.HTTP_500_INTERNAL_SERVER_ERROR,
        )
    return None
