package com.dora.aspect;

import com.dora.annotation.RequireAdminOrStaff;
import com.dora.util.AdminSecurityUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 管理员权限验证切面
 */
@Slf4j
@Aspect
@Component
public class AdminPermissionAspect {

    /**
     * 在执行标记了@RequireAdminOrStaff注解的方法前验证权限
     */
    @Before("@annotation(requireAdminOrStaff)")
    public void checkAdminPermission(JoinPoint joinPoint, RequireAdminOrStaff requireAdminOrStaff) {
        log.debug("验证管理员权限，方法: {}", joinPoint.getSignature().getName());
        
        // 检查是否已认证
        if (!AdminSecurityUtil.isAuthenticated()) {
            throw new RuntimeException("未认证，请先登录");
        }
        
        // 检查是否需要特定权限
        if (requireAdminOrStaff.requireAdmin()) {
            if (!AdminSecurityUtil.isAdmin()) {
                throw new RuntimeException("需要管理员权限");
            }
        } else if (requireAdminOrStaff.requireStaff()) {
            if (!AdminSecurityUtil.isStaff()) {
                throw new RuntimeException("需要工作人员权限");
            }
        } else {
            // 默认情况下，管理员或工作人员都可以访问
            if (!AdminSecurityUtil.isAdminOrStaff()) {
                throw new RuntimeException("需要管理员或工作人员权限");
            }
        }
        
        log.debug("权限验证通过，方法: {}", joinPoint.getSignature().getName());
    }
}
