"""
System API Module
提供系统管理相关的API接口
"""

from flask import g, jsonify, request
from app.api.system import bp
from app.models.result import success, failed
import logging
from app.core.system import (
    check_system_health,
    get_system_info,
    get_system_config,
    validate_config,
    authenticate_user,
)
from app.core.common.functions import translate_and_parse
from app.core.system.permissions import READ_GOVERNANCE, permissions_for_roles, require_permissions

logger = logging.getLogger("app")


# 健康检查接口
@bp.route('/health', methods=['GET'])
def health_check():
    """
    系统健康状态检查
    检查关键依赖组件的连接状态

    Returns:
        JSON: 系统健康状态信息
    """
    try:
        # 获取系统健康状态
        status = check_system_health()
        return jsonify(success(status))
    except Exception as e:
        logger.error(f"健康检查失败: {str(e)}")
        return jsonify(failed(str(e)))


# 系统配置信息
@bp.route('/config', methods=['GET'])
def system_config():
    """
    获取系统配置信息
    返回非敏感的系统配置项

    Returns:
        JSON: 系统配置信息
    """
    try:
        # 获取系统配置信息
        config_info = get_system_config()
        return jsonify(success(config_info))
    except Exception as e:
        logger.error(f"获取系统配置失败: {str(e)}")
        return jsonify(failed(str(e)))


# 系统信息接口
@bp.route('/info', methods=['GET'])
def system_info():
    """
    获取系统运行环境信息
    包括操作系统、Python版本、资源使用情况等

    Returns:
        JSON: 系统运行环境详细信息
    """
    try:
        # 获取系统详细信息
        info = get_system_info()
        return jsonify(success(info))
    except Exception as e:
        logger.error(f"获取系统信息失败: {str(e)}")
        return jsonify(failed(str(e)))


# 配置验证接口
@bp.route('/config/validate', methods=['GET'])
def config_validate():
    """
    验证系统配置的有效性
    检查必要的配置项是否存在且有效

    Returns:
        JSON: 配置验证结果
    """
    try:
        is_valid, errors = validate_config()
        result = {
            "valid": is_valid,
            "errors": errors
        }
        return jsonify(success(result))
    except Exception as e:
        logger.error(f"配置验证失败: {str(e)}")
        return jsonify(failed(str(e)))


# 用户登录接口
@bp.route('/auth/login', methods=['POST'])
def user_login():
    """
    用户登录

    请求参数:
        username: 用户名
        password: 密码

    Returns:
        JSON: 登录结果，包含用户信息
    """
    try:
        # 获取请求参数
        data = request.json
        if not data:
            return jsonify(failed("请求数据不能为空", code=400))

        username = data.get('username')
        password = data.get('password')

        # 参数验证
        if not username or not password:
            return jsonify(failed("用户名和密码不能为空", code=400))

        result = authenticate_user(
            username,
            password,
            ip_address=request.headers.get("X-Forwarded-For", request.remote_addr),
            user_agent=request.headers.get("User-Agent"),
        )

        if result:
            result["permissions"] = sorted(permissions_for_roles(result["roles"]))
            return jsonify(success(result, "登录成功"))
        return jsonify(failed("用户名或密码错误", code=401)), 401
    except PermissionError:
        return jsonify(failed("登录尝试过于频繁，请稍后重试", code=429)), 429
    except Exception as e:
        logger.error(f"用户登录失败: {str(e)}")
        return jsonify(failed(str(e)))


@bp.route('/auth/me', methods=['GET'])
@require_permissions(READ_GOVERNANCE)
def current_user():
    identity = dict(g.current_user)
    identity["permissions"] = sorted(permissions_for_roles(identity["roles"]))
    return jsonify(success(identity))


# 翻译接口
@bp.route('/translate', methods=['POST'])
def translate():
    """
    翻译节点名称

    请求参数:
        node_name: 需要翻译的节点名称

    Returns:
        JSON: 翻译结果
    """
    try:
        # 获取请求参数
        data = request.json
        if not data:
            return jsonify(failed("请求数据不能为空", code=400))

        node_name = data.get('node_name')

        # 参数验证
        if not node_name:
            return jsonify(failed("node_name参数不能为空", code=400))

        # 调用翻译函数
        translated_result = translate_and_parse(node_name)
        if not translated_result:
            return jsonify(
                failed(
                    "翻译失败，未能生成有效的英文标识符，请检查 DEEPSEEK_API_KEY 配置",
                    code=500,
                )
            )

        result = {
            "original": node_name,
            "translated": translated_result,
            "translated_list": translated_result,
        }

        return jsonify(success(result, "翻译成功"))
    except Exception as e:
        logger.error(f"翻译失败: {str(e)}")
        return jsonify(failed(f"翻译失败: {str(e)}"))
