from django.shortcuts import render
from django.conf import settings
from django.core.exceptions import PermissionDenied, SuspiciousOperation
from django.http import JsonResponse


def custom_error_view(request, status_code=None, exception=None):
    """
    全局自定义错误视图。
    API请求返回JSON，普通请求返回HTML页面。
    """
    # 判断是否为API请求：路径以'/api/'开头或接受JSON响应
    is_api_request = (request.path.startswith('/api/')
                      or 'application/json' in request.META.get(
                          'HTTP_ACCEPT', ''))

    if is_api_request:
        # 为API请求构建JSON错误响应
        error_messages = {
            400: {
                'message': 'Bad Request.'
            },
            403: {
                'message': 'Permission Denied.'
            },
            404: {
                'message': 'Resource Not Found.'
            },
            500: {
                'message': 'Internal Server Error.'
            },
        }
        error_info = error_messages.get(status_code,
                                        {'message': 'An error occurred.'})

        response_data = {
            'success': False,
            'error': {
                'code': status_code,
                'message': error_info['message'],
            }
        }
        # 在开发模式下可返回异常详情
        if settings.DEBUG and exception is not None:
            response_data['error']['detail'] = str(exception)

        return JsonResponse(response_data, status=status_code)
    # 非API请求，执行原有的HTML错误页面逻辑
    theme = getattr(settings, 'THEME_NAME', 'default')
    templates = [
        f"themes/{theme}/templates/utils/error.html",
        "themes/default/templates/utils/error.html"
    ]

    # 自动推断状态码（当通过handler直接调用时）
    if isinstance(exception, PermissionDenied):
        status_code = 403
    elif isinstance(exception, SuspiciousOperation):
        status_code = 400

    error_messages = {
        400: {
            'title': '错误请求',
            'message': '服务器无法理解该请求',
            'status': 400
        },
        403: {
            'title': '禁止访问',
            'message': '您没有权限执行此操作',
            'status': 403
        },
        404: {
            'title': '页面未找到',
            'message': '您访问的页面不存在或已被移除',
            'status': 404
        },
        500: {
            'title': '服务器错误',
            'message': '服务器内部发生错误',
            'status': 500
        },
        502: {
            'title': '网关错误',
            'status': 502
        }
    }

    context = error_messages.get(
        status_code, {
            'title': '发生错误',
            'message': str(exception) if exception else '未知错误',
            'status': status_code or 500
        })
    return render(request, templates, context, status=context['status'])
