"""
日志集成示例
展示如何在现有控制器中集成日志功能
"""
from flask import request, g
from flask_restx import Resource, Namespace, fields
from app.utils.logger import Logger, log_request_info, ErrorHandler
from app.utils.error_handler import handle_authentication_error, handle_validation_error

# 创建示例API命名空间
api = Namespace('log_example', description='日志集成示例')

# 定义API模型
login_model = api.model('Login', {
    'username': fields.String(required=True, description='用户名'),
    'password': fields.String(required=True, description='密码')
})

@api.route('/login')
class LoginResource(Resource):
    @api.expect(login_model, validate=True)
    @api.response(200, '登录成功')
    @api.response(401, '登录失败')
    @log_request_info  # 自动记录请求信息
    def post(self):
        """用户登录 - 集成日志示例"""
        data = request.get_json()
        
        # 记录登录尝试
        Logger.info("用户登录尝试", {
            'username': data.get('username'),
            'ip_address': request.remote_addr,
            'user_agent': request.headers.get('User-Agent')
        })
        
        try:
            # 模拟用户验证
            username = data.get('username')
            password = data.get('password')
            
            # 验证输入
            if not username or not password:
                Logger.warning("登录失败：缺少必要参数", {
                    'username': username,
                    'has_password': bool(password)
                })
                return handle_validation_error(
                    ValueError("用户名和密码不能为空"),
                    "username/password"
                )
            
            # 模拟用户验证逻辑
            if username == 'admin' and password == 'password':
                Logger.info("用户登录成功", {
                    'username': username,
                    'ip_address': request.remote_addr
                })
                
                return {
                    'message': '登录成功',
                    'user': {'username': username}
                }, 200
            else:
                Logger.warning("用户登录失败：凭据无效", {
                    'username': username,
                    'ip_address': request.remote_addr
                })
                
                return handle_authentication_error(
                    ValueError("用户名或密码错误"),
                    "invalid_credentials"
                )
                
        except Exception as e:
            Logger.error("登录过程中发生异常", e, {
                'username': data.get('username'),
                'ip_address': request.remote_addr
            })
            
            # 使用全局错误处理器
            ErrorHandler.handle_api_error(
                e,
                request.endpoint,
                {'username': data.get('username')}
            )
            
            raise

@api.route('/protected')
class ProtectedResource(Resource):
    @api.response(200, '访问成功')
    @api.response(401, '未授权')
    @log_request_info
    def get(self):
        """受保护的资源 - 展示访问日志"""
        # 记录受保护资源的访问
        Logger.access_log("访问受保护资源", {
            'resource': 'protected',
            'method': request.method,
            'ip_address': request.remote_addr
        })
        
        Logger.info("受保护资源被访问", {
            'endpoint': request.endpoint,
            'ip_address': request.remote_addr
        })
        
        return {
            'message': '这是受保护的资源',
            'timestamp': Logger.get_logger().handlers[0].formatter.formatTime(
                Logger.get_logger().handlers[0].formatter.converter()
            )
        }, 200

@api.route('/error-test')
class ErrorTestResource(Resource):
    @api.response(500, '测试错误')
    @log_request_info
    def get(self):
        """错误测试端点 - 展示错误处理"""
        Logger.info("开始错误测试")
        
        try:
            # 模拟不同类型的错误
            error_type = request.args.get('type', 'general')
            
            if error_type == 'database':
                Logger.error("模拟数据库错误", None, {'error_type': 'database'})
                ErrorHandler.handle_database_error(
                    ConnectionError("数据库连接失败"),
                    "查询用户信息"
                )
            elif error_type == 'validation':
                Logger.error("模拟验证错误", None, {'error_type': 'validation'})
                return handle_validation_error(
                    ValueError("数据验证失败"),
                    "email"
                )
            elif error_type == 'auth':
                Logger.error("模拟认证错误", None, {'error_type': 'auth'})
                return handle_authentication_error(
                    ValueError("Token无效"),
                    "invalid_token"
                )
            else:
                # 模拟一般异常
                raise RuntimeError("这是一个测试异常")
                
        except Exception as e:
            Logger.error("错误测试中发生异常", e, {
                'error_type': request.args.get('type', 'general'),
                'test_endpoint': True
            })
            
            # 记录全局错误
            Logger.global_error("错误测试异常", e, {
                'test_type': request.args.get('type', 'general')
            })
            
            raise
