# -*- coding: utf-8 -*-
"""
decorators.py — 权限验证装饰器

功能：
  - 登录验证装饰器
  - 角色权限验证装饰器
"""

from functools import wraps
from flask import session, jsonify, request, redirect, url_for

from utils.response import error_response
from utils.error_codes import ErrorCodes


def login_required(f):
    """登录验证装饰器"""
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if 'user' not in session:
            return jsonify(error_response(ErrorCodes.UNAUTHORIZED)), 401
        return f(*args, **kwargs)
    return decorated_function


def admin_required(f):
    """管理员权限装饰器"""
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if 'user' not in session:
            return jsonify(error_response(ErrorCodes.UNAUTHORIZED)), 401

        user = session.get('user', {})
        if user.get('role') != 'admin':
            return jsonify(error_response(ErrorCodes.FORBIDDEN, "权限不足，仅管理员可访问")), 403

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


def page_login_required(f):
    """
    页面级登录验证装饰器（用于页面路由）
    未登录时重定向到登录页，携带 next 参数
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if 'user' not in session:
            next_url = request.url
            return redirect(url_for('auth.login', next=next_url))
        return f(*args, **kwargs)
    return decorated_function