package com.easyagents.flow.core.chain.repository;

import java.io.Serializable;
import java.util.Objects;

/**
 * 循环累计输出的轻量引用，避免完整列表回写到高频热状态。
 */
public final class LoopResultReference implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final String REFERENCE_TYPE =
            "easyflow.loop-result.v1";

    private final String resultId;
    private final int iterationCount;
    private final String outputName;
    private final boolean flattenAggregation;

    /**
     * 创建循环结果引用。
     *
     * @param resultId 循环结果 ID
     * @param iterationCount 迭代次数
     * @param outputName 输出名称
     */
    public LoopResultReference(String resultId, int iterationCount, String outputName) {
        this(resultId, iterationCount, outputName, false);
    }

    /**
     * 创建带聚合策略的循环结果引用。
     *
     * @param resultId 循环结果 ID
     * @param iterationCount 迭代次数
     * @param outputName 输出名称
     * @param flattenAggregation 是否将各轮数组合并一层
     */
    public LoopResultReference(
            String resultId,
            int iterationCount,
            String outputName,
            boolean flattenAggregation) {
        this.resultId = Objects.requireNonNull(resultId, "resultId must not be null");
        this.iterationCount = iterationCount;
        this.outputName = Objects.requireNonNull(outputName, "outputName must not be null");
        this.flattenAggregation = flattenAggregation;
    }

    /**
     * 获取循环结果 ID。
     *
     * @return 循环结果 ID
     */
    public String getResultId() {
        return resultId;
    }

    /**
     * 获取累计迭代次数。
     *
     * @return 累计迭代次数
     */
    public int getIterationCount() {
        return iterationCount;
    }

    /**
     * 获取输出名称。
     *
     * @return 输出名称
     */
    public String getOutputName() {
        return outputName;
    }

    /**
     * 判断是否将各轮数组输出合并一层。
     *
     * @return 启用时返回 {@code true}
     */
    public boolean isFlattenAggregation() {
        return flattenAggregation;
    }

    /**
     * 获取跨异步审计边界使用的稳定引用类型。
     *
     * @return 引用类型
     */
    public String getReferenceType() {
        return REFERENCE_TYPE;
    }
}
