package com.kingdee.eas.custom.integration.apimgt.context;

import com.kingdee.eas.custom.integration.apimgt.ApiRegistryBillInfo;
import com.kingdee.eas.custom.integration.apimgt.OpenPlatformAuthBillInfo;

/**
 * 开放API请求上下文，基于ThreadLocal保存当前请求的调用方信息和API信息。
 *
 * <p>在认证拦截器中通过 {@link #bind(OpenPlatformAuthBillInfo, ApiRegistryBillInfo)} 写入，
 * 后续业务代码通过静态方法获取当前调用方平台和调用的API，无需逐层传参。
 *
 * <p>请求结束后必须调用 {@link #clear()} 清理，避免线程池复用时数据窜读。
 */
public final class OpenApiRequestContext {

    /** 当前调用方平台信息（appKey/appSecret等） */
    private static final ThreadLocal<OpenPlatformAuthBillInfo> PLATFORM_HOLDER = new ThreadLocal<>();
    /** 当前请求匹配到的API注册信息 */
    private static final ThreadLocal<ApiRegistryBillInfo> API_HOLDER = new ThreadLocal<>();
    /** 请求开始时间戳，用于耗时统计 */
    private static final ThreadLocal<Long> START_TIME_HOLDER = new ThreadLocal<>();
    /** 当前请求的API编码（冗余存储，避免重复查表） */
    private static final ThreadLocal<String> API_CODE_HOLDER = new ThreadLocal<>();

    private OpenApiRequestContext() {
    }

    /**
     * 绑定当前请求的调用方和API信息，由认证拦截器在请求入口调用。
     */
    public static void bind(OpenPlatformAuthBillInfo platform, ApiRegistryBillInfo api) {
        PLATFORM_HOLDER.set(platform);
        API_HOLDER.set(api);
    }

    public static void bindStartTime(long startTimeMs) {
        START_TIME_HOLDER.set(startTimeMs);
    }

    public static Long getStartTime() {
        return START_TIME_HOLDER.get();
    }

    public static void bindApiCode(String apiCode) {
        API_CODE_HOLDER.set(apiCode);
    }

    public static String getApiCode() {
        return API_CODE_HOLDER.get();
    }

    public static OpenPlatformAuthBillInfo currentPlatform() {
        return PLATFORM_HOLDER.get();
    }

    public static ApiRegistryBillInfo currentApi() {
        return API_HOLDER.get();
    }

    public static String currentCallerKey() {
        OpenPlatformAuthBillInfo p = PLATFORM_HOLDER.get();
        return p != null ? p.getPlatform() : null;
    }

    public static void clear() {
        PLATFORM_HOLDER.remove();
        API_HOLDER.remove();
        START_TIME_HOLDER.remove();
        API_CODE_HOLDER.remove();
    }
}
