package com.gxwebsoft.common.core.context;

/**
 * 租户上下文管理器
 * 
 * 用于在特定场景下临时禁用租户隔离
 * 
 * @author WebSoft
 * @since 2025-01-26
 */
public class TenantContext {
    
    private static final ThreadLocal<Boolean> IGNORE_TENANT = new ThreadLocal<>();
    
    /**
     * 设置忽略租户隔离
     */
    public static void setIgnoreTenant(boolean ignore) {
        IGNORE_TENANT.set(ignore);
    }
    
    /**
     * 是否忽略租户隔离
     */
    public static boolean isIgnoreTenant() {
        Boolean ignore = IGNORE_TENANT.get();
        return ignore != null && ignore;
    }
    
    /**
     * 清除租户上下文
     */
    public static void clear() {
        IGNORE_TENANT.remove();
    }
    
    /**
     * 在忽略租户隔离的上下文中执行操作
     * 
     * @param runnable 要执行的操作
     */
    public static void runIgnoreTenant(Runnable runnable) {
        boolean originalIgnore = isIgnoreTenant();
        try {
            setIgnoreTenant(true);
            runnable.run();
        } finally {
            setIgnoreTenant(originalIgnore);
        }
    }
    
    /**
     * 在忽略租户隔离的上下文中执行操作并返回结果
     * 
     * @param supplier 要执行的操作
     * @return 操作结果
     */
    public static <T> T callIgnoreTenant(java.util.function.Supplier<T> supplier) {
        boolean originalIgnore = isIgnoreTenant();
        try {
            setIgnoreTenant(true);
            return supplier.get();
        } finally {
            setIgnoreTenant(originalIgnore);
        }
    }
}
