package com.easyagents.federation.sql.execute;

import com.easyagents.federation.sql.federation.FederationQueryMode;
import java.io.Serializable;
import java.util.List;

/**
 * 查询游标当前或关闭后的不可变消耗指标快照。
 *
 * @param queryId 查询标识；不可用快照可为空
 * @param queryMode 查询模式
 * @param planCacheHit 是否命中计划缓存
 * @param planningNanos 编译阶段耗时
 * @param admissionWaitNanos 准入等待耗时
 * @param connectionAcquireNanos 全部分片获取连接累计耗时
 * @param databaseExecutionNanos 全部分片执行 Statement 累计耗时
 * @param localExecutionNanos 本地算子累计耗时
 * @param executionNanos 从执行开始到当前或结束的耗时
 * @param firstRowNanos 从执行开始到首行的耗时；尚未返回首行时为 -1
 * @param returnedRows 调用方已消费的最终结果行数
 * @param returnedBytes 最终结果估算字节数；Adapter 未安全提供时为 -1
 * @param intermediateRows 全部分片读取的中间结果行数
 * @param intermediateBytes 全部分片读取的中间结果估算字节数；Adapter 未安全提供时为 -1
 * @param complete 查询是否正常消费完成
 * @param cancelled 查询是否因取消结束
 * @param timedOut 查询是否因统一执行时限结束
 * @param truncated 是否因最终行数上限停止继续消费
 * @param terminalErrorCode 失败终态错误码；成功或尚未失败时为空
 * @param fragments 分片指标
 * @param localOperators 本地算子指标
 */
public record FederationQueryMetricsSnapshot(
    QueryId queryId,
    FederationQueryMode queryMode,
    boolean planCacheHit,
    long planningNanos,
    long admissionWaitNanos,
    long connectionAcquireNanos,
    long databaseExecutionNanos,
    long localExecutionNanos,
    long executionNanos,
    long firstRowNanos,
    long returnedRows,
    long returnedBytes,
    long intermediateRows,
    long intermediateBytes,
    boolean complete,
    boolean cancelled,
    boolean timedOut,
    boolean truncated,
    String terminalErrorCode,
    List<FederationFragmentMetrics> fragments,
    List<FederationLocalOperatorMetrics> localOperators
) implements Serializable {

    /**
     * 防御性复制分片指标。
     */
    public FederationQueryMetricsSnapshot {
        fragments = List.copyOf(fragments == null ? List.of() : fragments);
        localOperators = List.copyOf(localOperators == null ? List.of() : localOperators);
        terminalErrorCode = terminalErrorCode == null ? "" : terminalErrorCode;
    }

    /**
     * 创建旧基础字段视图的兼容指标快照。
     *
     * @param queryId 查询标识
     * @param queryMode 查询模式
     * @param planCacheHit 是否命中计划缓存
     * @param planningNanos 编译耗时
     * @param executionNanos 执行耗时
     * @param firstRowNanos 首行耗时
     * @param returnedRows 返回行数
     * @param returnedBytes 返回字节数
     * @param intermediateRows 中间行数
     * @param intermediateBytes 中间字节数
     * @param complete 是否完成
     * @param cancelled 是否取消
     * @param fragments 分片指标
     */
    public FederationQueryMetricsSnapshot(
        QueryId queryId,
        FederationQueryMode queryMode,
        boolean planCacheHit,
        long planningNanos,
        long executionNanos,
        long firstRowNanos,
        long returnedRows,
        long returnedBytes,
        long intermediateRows,
        long intermediateBytes,
        boolean complete,
        boolean cancelled,
        List<FederationFragmentMetrics> fragments
    ) {
        this(
            queryId,
            queryMode,
            planCacheHit,
            planningNanos,
            0,
            0,
            0,
            0,
            executionNanos,
            firstRowNanos,
            returnedRows,
            returnedBytes,
            intermediateRows,
            intermediateBytes,
            complete,
            cancelled,
            false,
            false,
            "",
            fragments,
            List.of()
        );
    }

    /**
     * 返回第三方 Adapter 尚未接入指标时的空快照。
     *
     * @return 空快照
     */
    public static FederationQueryMetricsSnapshot unavailable() {
        return new FederationQueryMetricsSnapshot(
            null,
            FederationQueryMode.SINGLE_SOURCE,
            false,
            0,
            0,
            0,
            0,
            0,
            0,
            -1,
            0,
            -1,
            0,
            -1,
            false,
            false,
            false,
            false,
            "",
            List.of(),
            List.of()
        );
    }
}
