/**
 * Copyright (c) 2025-2026, Michael Yang 杨福海 (fuhai999@gmail.com).
 * <p>
 * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.gnu.org/licenses/lgpl-3.0.txt
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.easyagents.flow.core.chain.event;

import com.easyagents.flow.core.chain.Chain;
import com.easyagents.flow.core.chain.Node;

/**
 * LLM 节点生成文本时发布的增量事件。
 */
public class LlmStreamEvent extends BaseEvent {

    private final Node node;
    private final String streamId;
    private final String delta;
    private final ContentType contentType;

    /**
     * LLM 流式内容类型。
     */
    public enum ContentType {
        /**
         * 模型正式回答。
         */
        TEXT,
        /**
         * 模型思考过程。
         */
        REASONING
    }

    /**
     * 创建 LLM 文本增量事件。
     *
     * @param chain 当前工作流
     * @param node 当前 LLM 节点
     * @param streamId 当前节点本次调用的流标识
     * @param delta 本次新增文本
     */
    public LlmStreamEvent(Chain chain, Node node, String streamId, String delta) {
        this(chain, node, streamId, delta, ContentType.TEXT);
    }

    /**
     * 创建指定内容类型的 LLM 增量事件。
     *
     * @param chain 当前工作流
     * @param node 当前 LLM 节点
     * @param streamId 当前节点本次调用的流标识
     * @param delta 本次新增内容
     * @param contentType 增量内容类型
     */
    public LlmStreamEvent(
            Chain chain,
            Node node,
            String streamId,
            String delta,
            ContentType contentType
    ) {
        super(chain);
        this.node = node;
        this.streamId = streamId;
        this.delta = delta;
        this.contentType = contentType == null
                ? ContentType.TEXT
                : contentType;
    }

    /**
     * 获取当前 LLM 节点。
     *
     * @return 当前节点
     */
    public Node getNode() {
        return node;
    }

    /**
     * 获取当前节点本次调用的流标识。
     *
     * @return 流标识
     */
    public String getStreamId() {
        return streamId;
    }

    /**
     * 获取本次新增文本。
     *
     * @return 文本增量
     */
    public String getDelta() {
        return delta;
    }

    /**
     * 获取本次增量的内容类型。
     *
     * @return 内容类型
     */
    public ContentType getContentType() {
        return contentType;
    }

    /**
     * 判断本次增量是否为模型思考内容。
     *
     * @return {@code true} 表示思考内容
     */
    public boolean isReasoning() {
        return contentType == ContentType.REASONING;
    }
}
