# 系统配置蓝图
# 处理系统配置、CSRF令牌等相关功能

from flask import Blueprint, request, jsonify, current_app
from flask_login import login_required, current_user
from datetime import datetime

from src.clients import db
from src.models import SystemConfig, SystemSetting

# 创建配置蓝图
config_bp = Blueprint('config', __name__)

# 全局变量
limiter = None
csrf = None
bcrypt = None
USE_ASR_ENDPOINT = False
ENABLE_CHUNKING = False
chunking_service = None

def init_config_bp(limiter_instance, csrf_instance, bcrypt_instance, use_asr_endpoint, enable_chunking, chunking_svc):
    """初始化蓝图所需的全局变量"""
    global limiter, csrf, bcrypt, USE_ASR_ENDPOINT, ENABLE_CHUNKING, chunking_service
    limiter = limiter_instance
    csrf = csrf_instance
    bcrypt = bcrypt_instance
    USE_ASR_ENDPOINT = use_asr_endpoint
    ENABLE_CHUNKING = enable_chunking
    chunking_service = chunking_svc


@config_bp.route('/api/config', methods=['GET'])
def get_config():
    """获取应用程序配置设置，供前端使用"""
    try:
        # 获取可配置的文件大小限制
        max_file_size_mb = SystemSetting.get_setting('max_file_size_mb', 250)
        
        # 获取分块配置信息（支持新旧两种格式）
        chunking_info = {}
        if ENABLE_CHUNKING and chunking_service:
            mode, limit_value = chunking_service.parse_chunk_limit()
            chunking_info = {
                'chunking_enabled': True,
                'chunking_mode': mode,  # 'size' 或 'duration'
                'chunking_limit': limit_value,  # 单位为 MB 或 秒
                'chunking_limit_display': f"{limit_value}{'MB' if mode == 'size' else 's'}"
            }
        else:
            chunking_info = {
                'chunking_enabled': False,
                'chunking_mode': 'size',
                'chunking_limit': 20,
                'chunking_limit_display': '20MB'
            }

        return jsonify({
            'max_file_size_mb': max_file_size_mb,
            'recording_disclaimer': SystemSetting.get_setting('recording_disclaimer', ''),
            'use_asr_endpoint': USE_ASR_ENDPOINT,
            **chunking_info
        })
    except Exception as e:
        current_app.logger.error(f"获取配置时出错: {e}")
        return jsonify({'error': str(e)}), 500


@config_bp.route('/api/csrf-token', methods=['GET'])
def get_csrf_token():
    """为前端获取新鲜的 CSRF 令牌"""
    try:
        from flask_wtf.csrf import generate_csrf
        token = generate_csrf()
        current_app.logger.info("新鲜 CSRF 令牌生成成功")
        return jsonify({'csrf_token': token})
    except Exception as e:
        current_app.logger.error(f"生成 CSRF 令牌时出错: {e}")
        return jsonify({'error': str(e)}), 500


@config_bp.route('/api/system-configs', methods=['GET'])
def get_system_configs():
    """获取所有系统配置（所有用户都可以访问）"""
    try:
        configs = SystemConfig.query.order_by(SystemConfig.config_key).all()
        return jsonify({
            'success': True,
            'configs': [config.to_dict() for config in configs]
        })
    except Exception as e:
        current_app.logger.error(f"获取系统配置时出错: {e}")
        return jsonify({'error': str(e)}), 500


@config_bp.route('/api/system-configs/<string:config_key>', methods=['GET'])
def get_system_config(config_key):
    """获取特定系统配置（所有用户都可以访问）"""
    try:
        config = SystemConfig.query.filter_by(config_key=config_key).first()
        if not config:
            return jsonify({
                'success': True,
                'config': None,
                'message': '配置不存在'
            })
            # return jsonify({'error': '配置不存在'}), 404
        
        return jsonify({
            'success': True,
            'config': config.to_dict()
        })
    except Exception as e:
        current_app.logger.error(f"获取系统配置时出错: {e}")
        return jsonify({'error': str(e)}), 500


@config_bp.route('/api/system-configs/<string:config_key>', methods=['PUT'])
@login_required
def update_system_config(config_key):
    """更新系统配置（只有管理员可以更新）"""
    try:
        # 检查用户权限
        if not current_user.is_admin:
            return jsonify({'error': '只有管理员可以更新系统配置'}), 403
        
        data = request.json
        if not data:
            return jsonify({'error': '没有提供数据'}), 400
        
        config_value = data.get('config_value')
        description = data.get('description')
        
        if config_value is None:
            return jsonify({'error': 'config_value 是必需的'}), 400
        
        # 使用更新而不是删除再插入
        existing_config = SystemConfig.query.filter_by(config_key=config_key).first()
        
        if existing_config:
            # 更新现有配置
            existing_config.config_value = config_value
            if description is not None:
                existing_config.description = description
            existing_config.updated_at = datetime.utcnow()
        else:
            # 创建新配置
            existing_config = SystemConfig(
                config_key=config_key,
                config_value=config_value,
                description=description
            )
            db.session.add(existing_config)
        
        db.session.commit()
        
        current_app.logger.info(f"管理员 {current_user.username} 更新了系统配置: {config_key}")
        
        return jsonify({
            'success': True,
            'message': '配置更新成功',
            'config': existing_config.to_dict()
        })
        
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(f"更新系统配置时出错: {e}")
        return jsonify({'error': str(e)}), 500


@config_bp.route('/api/system-configs/<string:config_key>', methods=['DELETE'])
@login_required
def delete_system_config(config_key):
    """删除系统配置（只有管理员可以删除）"""
    try:
        # 检查用户权限
        if not current_user.is_admin:
            return jsonify({'error': '只有管理员可以删除系统配置'}), 403
        
        config = SystemConfig.query.filter_by(config_key=config_key).first()
        if not config:
            return jsonify({'error': '配置不存在'}), 404
        
        db.session.delete(config)
        db.session.commit()
        
        current_app.logger.info(f"管理员 {current_user.username} 删除了系统配置: {config_key}")
        
        return jsonify({
            'success': True,
            'message': '配置删除成功'
        })
        
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(f"删除系统配置时出错: {e}")
        return jsonify({'error': str(e)}), 500

