"""
全局错误处理器
处理应用中的各种异常和错误
"""
from flask import jsonify, request, current_app
from app.utils.logger import Logger, ErrorHandler
import traceback


def register_error_handlers(app):
    """注册全局错误处理器"""
    
    @app.errorhandler(400)
    def bad_request(error):
        """处理400错误"""
        ErrorHandler.handle_api_error(
            error,
            request.endpoint if request else None,
            request.get_json() if request and request.is_json else None
        )
        
        return jsonify({
            'error': 'Bad Request',
            'message': '请求格式错误',
            'status_code': 400
        }), 400
    
    @app.errorhandler(401)
    def unauthorized(error):
        """处理401错误"""
        ErrorHandler.handle_api_error(
            error,
            request.endpoint if request else None,
            {'auth_error': True}
        )
        
        return jsonify({
            'error': 'Unauthorized',
            'message': '未授权访问',
            'status_code': 401
        }), 401
    
    @app.errorhandler(403)
    def forbidden(error):
        """处理403错误"""
        ErrorHandler.handle_api_error(
            error,
            request.endpoint if request else None,
            {'permission_error': True}
        )
        
        return jsonify({
            'error': 'Forbidden',
            'message': '禁止访问',
            'status_code': 403
        }), 403
    
    @app.errorhandler(404)
    def not_found(error):
        """处理404错误"""
        ErrorHandler.handle_api_error(
            error,
            request.endpoint if request else None,
            {'not_found': True}
        )
        
        return jsonify({
            'error': 'Not Found',
            'message': '资源未找到',
            'status_code': 404
        }), 404
    
    @app.errorhandler(405)
    def method_not_allowed(error):
        """处理405错误"""
        ErrorHandler.handle_api_error(
            error,
            request.endpoint if request else None,
            {'method': request.method if request else None}
        )
        
        return jsonify({
            'error': 'Method Not Allowed',
            'message': '请求方法不允许',
            'status_code': 405
        }), 405
    
    @app.errorhandler(422)
    def unprocessable_entity(error):
        """处理422错误"""
        ErrorHandler.handle_api_error(
            error,
            request.endpoint if request else None,
            request.get_json() if request and request.is_json else None
        )
        
        return jsonify({
            'error': 'Unprocessable Entity',
            'message': '请求数据无法处理',
            'status_code': 422
        }), 422
    
    @app.errorhandler(500)
    def internal_server_error(error):
        """处理500错误"""
        ErrorHandler.handle_exception(
            error,
            f"内部服务器错误 - {request.endpoint if request else '未知端点'}"
        )
        
        return jsonify({
            'error': 'Internal Server Error',
            'message': '服务器内部错误',
            'status_code': 500
        }), 500
    
    @app.errorhandler(Exception)
    def handle_unexpected_error(error):
        """处理未预期的异常"""
        ErrorHandler.handle_exception(
            error,
            f"未预期异常 - {request.endpoint if request else '未知端点'}"
        )
        
        # 在开发模式下返回详细错误信息
        if current_app.debug:
            return jsonify({
                'error': 'Unexpected Error',
                'message': str(error),
                'traceback': traceback.format_exc(),
                'status_code': 500
            }), 500
        
        return jsonify({
            'error': 'Unexpected Error',
            'message': '发生未预期的错误',
            'status_code': 500
        }), 500


def handle_database_error(error, operation=None):
    """处理数据库错误"""
    ErrorHandler.handle_database_error(error, operation)
    
    return jsonify({
        'error': 'Database Error',
        'message': '数据库操作失败',
        'status_code': 500
    }), 500


def handle_validation_error(error, field=None):
    """处理验证错误"""
    ErrorHandler.handle_api_error(
        error,
        request.endpoint if request else None,
        {'validation_error': True, 'field': field}
    )
    
    return jsonify({
        'error': 'Validation Error',
        'message': f'数据验证失败: {field or "未知字段"}',
        'status_code': 400
    }), 400


def handle_authentication_error(error, reason=None):
    """处理认证错误"""
    ErrorHandler.handle_api_error(
        error,
        request.endpoint if request else None,
        {'auth_error': True, 'reason': reason}
    )
    
    return jsonify({
        'error': 'Authentication Error',
        'message': f'认证失败: {reason or "未知原因"}',
        'status_code': 401
    }), 401
