"""
Flask 扩展实例集合

集中管理所有 Flask 扩展的实例化与初始化，包括：
- LoginManager: 用户认证管理
- Bcrypt: 密码加密
- Limiter: 请求频率限制
- CSRFProtect: CSRF 防护
"""
import os
from flask_login import LoginManager
from flask_bcrypt import Bcrypt
from flask_wtf.csrf import CSRFProtect
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from flask_sock import Sock

# ==================== Flask 扩展实例 ====================
# 用户认证管理器
login_manager = LoginManager()
login_manager.login_view = '/tool/speakr'
login_manager.login_message_category = 'info'

# 密码加密器
bcrypt = Bcrypt()

# 请求频率限制器（默认限制：5000次/天，1000次/小时）
limiter = Limiter(
    get_remote_address,
    app=None,
    default_limits=["5000 per day", "1000 per hour"]
)

# CSRF 防护
csrf = CSRFProtect()

# WebSocket 支持
sock = Sock()


def init_extensions(app):
    """
    初始化所有 Flask 扩展
    
    Args:
        app: Flask 应用实例
    """
    # 初始化用户认证
    login_manager.init_app(app)
    
    # 初始化密码加密
    bcrypt.init_app(app)
    
    # 初始化频率限制
    limiter.init_app(app)
    
    # 初始化 CSRF 防护
    csrf.init_app(app)

    sock.init_app(app)
    
    # 创建上传目录（如果不存在）
    upload_folder = app.config.get('UPLOAD_FOLDER', 'uploads')
    os.makedirs(upload_folder, exist_ok=True)
    
    # 注册用户加载器
    @login_manager.user_loader
    def load_user(user_id):
        from src.models import User
        from src.clients import db
        return db.session.get(User, user_id)
