package com.qiaoba.common.base.context;

/**
 * 全局上下文对象
 *
 * @author ailanyin
 * @version 1.0
 * @since 2023/5/22 17:24
 */
public class BaseContext {

    /**
     * 数据库类型
     */
    private static final ThreadLocal<String> DATABASE_TYPE_HOLDER = new ThreadLocal<>();

    /**
     * SCHEMA
     */
    private static final ThreadLocal<Boolean> SCHEMA_HOLDER = new ThreadLocal<>();

    /**
     * 租户ID
     */
    private static final ThreadLocal<String> TENANT_ID_HOLDER = new ThreadLocal<>();

    /**
     * 数据源
     */
    private static final ThreadLocal<String> DATASOURCE_HOLDER = new ThreadLocal<>();

    /**
     * 获取上下文中数据库类型
     */
    public static String getDatabaseType() {
        return DATABASE_TYPE_HOLDER.get();
    }

    /**
     * 设置上下文中数据库类型
     */
    public static void setDatabaseType(String type) {
        DATABASE_TYPE_HOLDER.set(type);
    }

    /**
     * 获取上下文中租户ID
     */
    public static String getTenantId() {
        return TENANT_ID_HOLDER.get();
    }

    /**
     * 设置上下文中租户ID
     */
    public static void setTenantId(String tenantId) {
        TENANT_ID_HOLDER.set(tenantId);
    }

    /**
     * 清除上下文中租户ID
     */
    public static void clearTenantId() {
        TENANT_ID_HOLDER.remove();
    }

    /**
     * 获取上下文中的数据源
     */
    public static String getDataSource() {
        return DATASOURCE_HOLDER.get();
    }

    /**
     * 设置上下文中的数据源
     */
    public static void setDataSource(String dataSource) {
        DATASOURCE_HOLDER.set(dataSource);
    }

    /**
     * 是否是 Schema模式
     *
     * @return Boolean
     */
    public static Boolean isSchemaMode() {
        return SCHEMA_HOLDER.get();
    }

    /**
     * 设置是否是 Schema模式
     *
     * @param isSchema 是/否
     */
    public static void setSchema(boolean isSchema) {
        SCHEMA_HOLDER.set(isSchema);
    }

    /**
     * 清除所有的ThreadLocal
     */
    public static void clearAllHolder() {
        // 清除上下文中数据源
        DATASOURCE_HOLDER.remove();
        // 清除上下文中租户ID
        TENANT_ID_HOLDER.remove();
        // 清除上下文中数据库类型
        DATABASE_TYPE_HOLDER.remove();
        // 清除上下文中 SCHEMA
        SCHEMA_HOLDER.remove();
    }

}
