package com.easyagents.agent.runtime.event;

import com.easyagents.agent.runtime.AgentRuntimeExecutionContext;
import reactor.core.publisher.Sinks;

import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 保存当前运行轮次上下文。
 */
public class AgentRuntimeTurnContextHolder {

    private final AtomicReference<AgentRuntimeTurnContext> current = new AtomicReference<>();

    /**
     * 设置当前运行轮次上下文。
     *
     * @param context 当前轮次上下文
     */
    public void set(AgentRuntimeTurnContext context) {
        current.set(context);
    }

    /**
     * 清理当前运行轮次上下文。
     */
    public void clear() {
        current.set(null);
    }

    /**
     * 获取当前运行轮次上下文。
     *
     * @return 当前轮次上下文
     */
    public Optional<AgentRuntimeTurnContext> current() {
        return Optional.ofNullable(current.get());
    }

    /**
     * 获取当前轮次事件 sink。
     *
     * @return 当前轮次旁路事件 sink
     */
    public Optional<Sinks.Many<AgentRuntimeEvent>> eventSink() {
        return current()
                .map(AgentRuntimeTurnContext::getEventSink)
                .filter(sink -> sink != null);
    }

    /**
     * 获取当前轮次旁路事件桥。
     *
     * @return 当前轮次旁路事件桥
     */
    public Optional<AgentRuntimeEventBridge> eventBridge() {
        return current()
                .map(AgentRuntimeTurnContext::getEventBridge)
                .filter(bridge -> bridge != null);
    }

    /**
     * 合并当前轮次上下文和运行时级上下文。
     *
     * @param fallback 运行时级上下文
     * @return 合并后的上下文
     */
    public AgentRuntimeExecutionContext executionContext(AgentRuntimeExecutionContext fallback) {
        return current()
                .map(context -> context.mergeWith(fallback))
                .orElse(fallback);
    }
}
