package com.storlead.framework.core.tenant;

import com.storlead.framework.core.context.Context;
import com.storlead.framework.core.context.IContext;

/**
 * 基于 {@link Context} 的请求级租户 ID；供 Web、MyBatis 插件、业务代码统一读取。
 */
public final class TenantContext {

    private TenantContext() {
    }

    /**
     * 写入当前租户（通常在登录鉴权通过后调用）。
     */
    public static void bindTenantId(Long tenantId) {
        IContext ctx = Context.getContext();
        if (ctx != null && tenantId != null) {
            ctx.setAttribute(TenantConstants.CURRENT_TENANT_ID, tenantId);
        }
    }

    /**
     * 当前线程上下文中解析出的租户 ID；白名单匿名请求等场景可能为 null。
     */
    public static Long getTenantId() {
        if (isIgnoreTenantLine()) {
            return null;
        }
        IContext ctx = Context.getContext();
        if (ctx == null) {
            return null;
        }
        return ctx.getAttribute(TenantConstants.CURRENT_TENANT_ID, Long.class);
    }

    public static boolean isIgnoreTenantLine() {
        IContext ctx = Context.getContext();
        if (ctx == null) {
            return false;
        }
        return Boolean.TRUE.equals(ctx.getAttribute(TenantConstants.IGNORE_TENANT_LINE, Boolean.class));
    }

    /**
     * 跳过多租户 SQL 条件注入与填充（必须仅在可信代码路径使用）。
     */
    public static void setIgnoreTenantLine(boolean ignore) {
        IContext ctx = Context.getContext();
        if (ctx == null) {
            return;
        }
        if (ignore) {
            ctx.setAttribute(TenantConstants.IGNORE_TENANT_LINE, Boolean.TRUE);
        } else {
            ctx.removeAttribute(TenantConstants.IGNORE_TENANT_LINE);
        }
    }
}
