package com.easyagents.federation.sql.federation;

import java.io.Serializable;
import java.time.Instant;
import java.util.List;
import java.util.Map;

/**
 * 调用方或 Adapter 提供的一张物理表的轻量统计快照。
 *
 * @param estimatedRows 估算总行数
 * @param averageRowWidthBytes 平均物理行宽字节数
 * @param collectedAt 统计采集时间
 * @param source 统计来源，例如 catalog、adapter 或业务统计服务
 * @param columns 按物理列名索引的列统计
 * @param uniqueKeys 唯一键列集合
 * @param expiresAt 统计失效时间；不失效时为 {@link Instant#MAX}
 * @param status Provider 声明的统计完整状态
 */
public record FederationTableStatistics(
    double estimatedRows,
    long averageRowWidthBytes,
    Instant collectedAt,
    String source,
    Map<String, FederationColumnStatistics> columns,
    List<List<String>> uniqueKeys,
    Instant expiresAt,
    FederationStatisticsStatus status
) implements Serializable {

    /**
     * 校验并规范化统计值。
     */
    public FederationTableStatistics {
        if (!Double.isFinite(estimatedRows) || estimatedRows < 0) {
            throw new IllegalArgumentException("estimatedRows must be finite and non-negative");
        }
        if (averageRowWidthBytes <= 0) {
            throw new IllegalArgumentException("averageRowWidthBytes must be positive");
        }
        collectedAt = collectedAt == null ? Instant.EPOCH : collectedAt;
        source = source == null || source.isBlank() ? "unspecified" : source;
        columns = Map.copyOf(columns == null ? Map.of() : columns);
        uniqueKeys = (uniqueKeys == null ? List.<List<String>>of() : uniqueKeys).stream()
            .map(List::copyOf)
            .toList();
        expiresAt = expiresAt == null ? Instant.MAX : expiresAt;
        status = status == null ? FederationStatisticsStatus.COMPLETE : status;
    }

    /**
     * 创建仅包含表级统计的兼容快照。
     *
     * @param estimatedRows 估算总行数
     * @param averageRowWidthBytes 平均行宽
     * @param collectedAt 采集时间
     * @param source 统计来源
     */
    public FederationTableStatistics(
        double estimatedRows,
        long averageRowWidthBytes,
        Instant collectedAt,
        String source
    ) {
        this(
            estimatedRows,
            averageRowWidthBytes,
            collectedAt,
            source,
            Map.of(),
            List.of(),
            Instant.MAX,
            FederationStatisticsStatus.COMPLETE
        );
    }

    /**
     * 返回指定时刻的有效状态。
     *
     * @param now 当前时间
     * @return 计入有效期后的状态
     */
    public FederationStatisticsStatus effectiveStatus(Instant now) {
        if (status != FederationStatisticsStatus.MISSING
            && !expiresAt.isAfter(now == null ? Instant.now() : now)) {
            return FederationStatisticsStatus.STALE;
        }
        return status;
    }
}
