package com.cf.imes.framework.organ.core.context;

import cn.hutool.core.util.StrUtil;
import com.cf.imes.framework.common.enums.DocumentEnum;
import com.alibaba.ttl.TransmittableThreadLocal;

/**
 * 多组织上下文 Holder
 *
 * @author 晨丰科技
 */
public class OrganContextHolder {

    /**
     * 当前组织编号
     */
    private static final ThreadLocal<Long> ORGAN_ID = new TransmittableThreadLocal<>();

    /**
     * 是否忽略组织
     */
    private static final ThreadLocal<Boolean> IGNORE = new TransmittableThreadLocal<>();

    /**
     * 上下文获取不到organid异常提示
     */
    public static final String ORGANID_NOT_EXIST_EXCEPTION = "OrganContextHolder 不存在组织编号！";

    /**
     * 获得组织编号
     *
     * @return 组织编号
     */
    public static Long getOrganId() {
        return ORGAN_ID.get();
    }

    /**
     * 获得组织编号 String
     *
     * @return 组织编号
     */
    public static String getOrganIdStr() {
        Long organId = getOrganId();
        return StrUtil.toStringOrNull(organId);
    }

    /**
     * 获得组织编号。如果不存在，则抛出 NullPointerException 异常
     *
     * @return 组织编号
     */
    public static Long getRequiredOrganId() {
        Long organId = getOrganId();
        if (organId == null) {
            throw new NullPointerException(ORGANID_NOT_EXIST_EXCEPTION);
        }
        return organId;
    }

    public static void setOrganId(Long organId) {
        ORGAN_ID.set(organId);
    }

    public static void setIgnore(Boolean ignore) {
        IGNORE.set(ignore);
    }

    /**
     * 当前是否忽略组织
     *
     * @return 是否忽略
     */
    public static boolean isIgnore() {
        return Boolean.TRUE.equals(IGNORE.get());
    }

    public static void clear() {
        ORGAN_ID.remove();
        IGNORE.remove();
    }

}
