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

import com.cf.imes.framework.organ.core.context.OrganContextHolder;

import java.util.Map;
import java.util.concurrent.Callable;

import static com.cf.imes.framework.web.core.util.WebFrameworkUtils.HEADER_ORGAN_ID;

/**
 * 多组织 Util
 *
 * @author 晨丰科技
 */
public class OrganUtils {

    /**
     * 使用指定组织，执行对应的逻辑
     *
     * 注意，如果当前是忽略组织的情况下，会被强制设置成不忽略组织
     * 当然，执行完成后，还是会恢复回去
     *
     * @param organId 组织编号
     * @param runnable 逻辑
     */
    public static void execute(Long organId, Runnable runnable) {
        Long oldorganId = OrganContextHolder.getOrganId();
        Boolean oldIgnore = OrganContextHolder.isIgnore();
        try {
            OrganContextHolder.setOrganId(organId);
            OrganContextHolder.setIgnore(false);
            // 执行逻辑
            runnable.run();
        } finally {
            OrganContextHolder.setOrganId(oldorganId);
            OrganContextHolder.setIgnore(oldIgnore);
        }
    }

    /**
     * 使用指定组织，执行对应的逻辑
     *
     * 注意，如果当前是忽略组织的情况下，会被强制设置成不忽略组织
     * 当然，执行完成后，还是会恢复回去
     *
     * @param organId 组织编号
     * @param callable 逻辑
     */
    public static <V> V execute(Long organId, Callable<V> callable) {
        Long oldorganId = OrganContextHolder.getOrganId();
        Boolean oldIgnore = OrganContextHolder.isIgnore();
        try {
            OrganContextHolder.setOrganId(organId);
            OrganContextHolder.setIgnore(false);
            // 执行逻辑
            return callable.call();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            OrganContextHolder.setOrganId(oldorganId);
            OrganContextHolder.setIgnore(oldIgnore);
        }
    }

    /**
     * 忽略组织，执行对应的逻辑
     *
     * @param runnable 逻辑
     */
    public static void executeIgnore(Runnable runnable) {
        Boolean oldIgnore = OrganContextHolder.isIgnore();
        try {
            OrganContextHolder.setIgnore(true);
            // 执行逻辑
            runnable.run();
        } finally {
            OrganContextHolder.setIgnore(oldIgnore);
        }
    }

    /**
     * 将多组织编号，添加到 header 中
     *
     * @param headers HTTP 请求 headers
     * @param organId 组织编号
     */
    public static void addTenantHeader(Map<String, String> headers, Long organId) {
        if (organId != null) {
            headers.put(HEADER_ORGAN_ID, organId.toString());
        }
    }

}
