from functools import wraps
from flask import redirect, url_for, flash, g, request, jsonify
from app.models.database.models import Role, Permission, SystemConfig

def login_required(f):
    """
    登录验证装饰器
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if g.user is None:
            # 如果是AJAX请求，返回JSON响应
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({'error': '请先登录', 'redirect': url_for('auth.login')}), 401
            
            # 普通请求，重定向到登录页面
            flash('请先登录', 'warning')
            return redirect(url_for('auth.login'))
        return f(*args, **kwargs)
    return decorated_function

def permission_required(permission):
    """
    权限验证装饰器
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not g.user or not g.user.has_permission(permission):
                flash('权限不足', 'error')
                return redirect(url_for('main.index'))
            return f(*args, **kwargs)
        return decorated_function
    return decorator

def admin_required(f):
    """
    管理员权限验证装饰器 - 允许 admin 和 moderator 访问后台
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        # 检查是否登录
        if g.user is None:
            # 如果是AJAX请求，返回JSON响应
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({'error': '请先登录', 'redirect': url_for('auth.login')}), 401

            # 普通请求，重定向到登录页面
            flash('请先登录', 'warning')
            return redirect(url_for('auth.login'))

        # 检查是否是管理员（admin 或 moderator）
        if g.user.role not in [Role.ADMIN, Role.MODERATOR]:
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({'error': '权限不足，需要管理员权限', 'redirect': url_for('main.index')}), 403

            flash('权限不足，需要管理员权限', 'error')
            return redirect(url_for('main.index'))

        return f(*args, **kwargs)
    return decorated_function


def superadmin_required(f):
    """
    超级管理员权限验证装饰器 - 仅允许 admin 访问
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        # 检查是否登录
        if g.user is None:
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({'error': '请先登录', 'redirect': url_for('auth.login')}), 401
            flash('请先登录', 'warning')
            return redirect(url_for('auth.login'))

        # 检查是否是超级管理员
        if g.user.role != Role.ADMIN:
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({'error': '权限不足，需要超级管理员权限', 'redirect': url_for('main.index')}), 403
            flash('权限不足，需要超级管理员权限', 'error')
            return redirect(url_for('main.index'))

        return f(*args, **kwargs)
    return decorated_function
