package com.ruoyi.framework.security.context;

import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;

/**
 * 部门上下文管理器
 * 
 * 提供线程安全的部门上下文管理，支持当前用户部门ID的获取和设置，
 * 以及超级管理员权限判断功能。
 * 
 * @author ruoyi
 */
public class DepartmentContextHolder
{
    /**
     * 部门上下文ThreadLocal存储
     */
    private static final ThreadLocal<Long> DEPT_CONTEXT = new ThreadLocal<>();

    /**
     * 设置当前线程的部门ID
     * 
     * @param deptId 部门ID
     */
    public static void setCurrentDeptId(Long deptId)
    {
        DEPT_CONTEXT.set(deptId);
    }

    /**
     * 获取当前线程的部门ID
     * 
     * 优先从ThreadLocal获取，如果没有则从SecurityUtils获取当前用户的部门ID
     * 
     * @return 部门ID，如果无法获取则返回null
     */
    public static Long getCurrentDeptId()
    {
        Long deptId = DEPT_CONTEXT.get();
        if (deptId != null)
        {
            return deptId;
        }
        
        // 如果ThreadLocal中没有，则从SecurityUtils获取当前用户部门ID
        try
        {
            return SecurityUtils.getDeptId();
        }
        catch (Exception e)
        {
            return null;
        }
    }

    /**
     * 清除当前线程的部门上下文
     */
    public static void clear()
    {
        DEPT_CONTEXT.remove();
    }

    /**
     * 判断当前用户是否为超级管理员
     * 
     * 超级管理员拥有访问所有部门数据的权限，不受部门隔离限制
     * 
     * @return true-超级管理员，false-普通用户
     */
    public static boolean isSuperAdmin()
    {
        try
        {
            LoginUser loginUser = SecurityUtils.getLoginUser();
            if (loginUser == null || loginUser.getUser() == null)
            {
                return false;
            }
            
            // 使用SysUser的isAdmin方法判断是否为超级管理员
            return loginUser.getUser().isAdmin();
        }
        catch (Exception e)
        {
            // 如果获取用户信息失败，默认不是超级管理员
            return false;
        }
    }

    /**
     * 获取当前用户ID
     * 
     * @return 用户ID，如果无法获取则返回null
     */
    public static Long getCurrentUserId()
    {
        try
        {
            return SecurityUtils.getUserId();
        }
        catch (Exception e)
        {
            return null;
        }
    }

    /**
     * 获取当前用户名
     * 
     * @return 用户名，如果无法获取则返回null
     */
    public static String getCurrentUsername()
    {
        try
        {
            return SecurityUtils.getUsername();
        }
        catch (Exception e)
        {
            return null;
        }
    }

    /**
     * 检查当前用户是否有权限访问指定部门的数据
     * 
     * @param targetDeptId 目标部门ID
     * @return true-有权限，false-无权限
     */
    public static boolean hasAccessToDept(Long targetDeptId)
    {
        // 超级管理员可以访问所有部门数据
        if (isSuperAdmin())
        {
            return true;
        }
        
        // 普通用户只能访问自己部门的数据
        Long currentDeptId = getCurrentDeptId();
        return currentDeptId != null && currentDeptId.equals(targetDeptId);
    }
}