package vip.xiaonuo.coldchain.core.service;

/**
 * @author jackzhou
 * @version 1.0
 * @project jfcloud-coldchain
 * @description
 * @date 2024/12/10 12:00:28
 */

import lombok.experimental.UtilityClass;

import java.time.Duration;
import java.time.Instant;

@UtilityClass

public class FluxAggregationUtils {

    /**
     * 确定适合的聚合窗口
     *
     * @param startTime 起始时间（ISO 8601 格式，例如 "2024-01-01T00:00:00Z"）
     * @param stopTime  结束时间（ISO 8601 格式，例如 "2024-03-01T00:00:00Z"）
     * @return 聚合窗口大小 ("1mo", "1w", "1d", "1h")
     */
    public static String determineAggregationWindow(String startTime, String stopTime) {
        Instant start = Instant.parse(startTime);
        Instant stop = Instant.parse(stopTime);
        // 计算时间间隔
        Duration duration = Duration.between(start, stop);
        // 获取时、分、秒等单位的差异
        long days = duration.toDays();
        long hours = duration.toHours() % 24; // 剩余的小时
        long minutes = duration.toMinutes() % 60; // 剩余的分钟
        // 判断时间间隔并选择合适的聚合窗口
        if (days > 365) {
            return "1y"; // 超过 1 年按年度聚合
        } else if (days > 90) {
            return "1mo"; // 超过 90 天按月度聚合
        } else if (days > 30) {
            return "1w"; // 超过 30 天按每周聚合
        } else if (days > 1 || hours >= 12) {
            return "1d"; // 超过 1 天或接近一天（12小时以上）按每日聚合
        } else if (hours > 1) {
            return "1h"; // 超过 1 小时但小于 12 小时按每小时聚合
        } else if (minutes >= 30) {
            return "30m"; // 超过 30 分钟但小于 1 小时按每 30 分钟聚合
        } else if (minutes > 5) {
            return "5m"; // 超过 5 分钟按每 5 分钟聚合
        } else {
            return "1m"; // 小于 5 分钟按每分钟聚合
        }
    }

}
