package com.dora.util;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import jakarta.servlet.http.HttpServletRequest;

/**
 * 管理员安全工具类
 */
public class AdminSecurityUtil {

    /**
     * 获取当前认证管理员的ID
     * @return 管理员ID
     * @throws RuntimeException 如果管理员未认证或ID格式错误
     */
    public static Long getCurrentAdminId() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        
        // 检查管理员是否已认证
        if (authentication == null || "anonymousUser".equals(authentication.getName()) || !authentication.isAuthenticated()) {
            throw new RuntimeException("管理员未认证，请先登录");
        }
        
        // 安全地获取管理员ID
        try {
            return Long.valueOf(authentication.getName());
        } catch (NumberFormatException e) {
            throw new RuntimeException("管理员ID格式错误，请重新登录");
        }
    }

    /**
     * 检查管理员是否已认证
     * @return true表示已认证，false表示未认证
     */
    public static boolean isAuthenticated() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return authentication != null && 
               !"anonymousUser".equals(authentication.getName()) && 
               authentication.isAuthenticated();
    }

    /**
     * 获取当前管理员角色
     * @return 角色值（0-工作人员，1-管理员）
     * @throws RuntimeException 如果无法获取角色信息
     */
    public static Integer getCurrentAdminRole() {
        try {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (attributes != null) {
                HttpServletRequest request = attributes.getRequest();
                Object roleObj = request.getAttribute("adminRole");
                if (roleObj != null) {
                    if (roleObj instanceof Integer) {
                        return (Integer) roleObj;
                    } else if (roleObj instanceof String) {
                        return Integer.valueOf((String) roleObj);
                    }
                }
            }
            throw new RuntimeException("无法获取管理员角色信息");
        } catch (Exception e) {
            throw new RuntimeException("获取管理员角色信息失败: " + e.getMessage());
        }
    }

    /**
     * 检查当前用户是否为管理员（role=1）
     * @return true表示是管理员，false表示不是
     */
    public static boolean isAdmin() {
        try {
            Integer role = getCurrentAdminRole();
            return role != null && role == 1;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 检查当前用户是否为工作人员（role=0）
     * @return true表示是工作人员，false表示不是
     */
    public static boolean isStaff() {
        try {
            Integer role = getCurrentAdminRole();
            return role != null && role == 0;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 检查当前用户是否为管理员或工作人员
     * @return true表示是管理员或工作人员，false表示不是
     */
    public static boolean isAdminOrStaff() {
        return isAuthenticated();
    }
}
