package vip.xiaonuo.coldchain.core.service;

import java.util.Map;

public class FluxQueryBuilder {

    /**
     * 构造查询温度数据的 Flux 查询字符串
     *
     * @param bucket      数据所在的 bucket 名称
     * @param startTime   查询的开始时间（ISO 8601 格式）
     * @param endTime     查询的结束时间（ISO 8601 格式）
     * @param measurement 测量名称
     * @param field       字段名称（如 temperature）
     * @param filters     额外的过滤条件（标签键值对）
     * @param interval    聚合时间间隔（如 1d 表示一天）
     * @return 构造的 Flux 查询字符串
     */
    public static String buildRangeQuery(
            String bucket,
            String startTime,
            String endTime,
            String measurement,
            String field,
            Map<String, String> filters,
            String interval) {

        StringBuilder flux = new StringBuilder();

        // 指定数据来源 bucket
        flux.append("from(bucket: \"").append(bucket).append("\")\n");

        // 指定时间范围
        flux.append("  |> range(start: time(v: \"").append(startTime)
                .append("\"), stop: time(v: \"").append(endTime).append("\"))\n");

        // 基本过滤条件
        flux.append("  |> filter(fn: (r) => r[\"_measurement\"] == \"")
                .append(measurement).append("\" and r[\"_field\"] == \"").append(field).append("\"");

        // 动态标签过滤条件
        if (filters != null && !filters.isEmpty()) {
            for (Map.Entry<String, String> filter : filters.entrySet()) {
                flux.append(" and r[\"").append(filter.getKey()).append("\"] == \"")
                        .append(filter.getValue()).append("\"");
            }
        }
        flux.append(")\n");
        // 将时间调整为 UTC+8
//        flux.append("  |> timeShift(duration: 8h)\n");

        // 聚合窗口
        if (interval != null && !interval.isEmpty()) {
            flux.append("  |> aggregateWindow(every: ").append(interval)
                    .append(", fn: mean, createEmpty: false)\n");
        }
        // 按时间升序排序
        flux.append("  |> sort(columns: [\"_time\"], desc: false)\n");
        flux.append("  |> map(fn: (r) => ({_time: r._time, create_time: r._time, "+field+": r._value}))\n");
        return flux.toString();
    }

//    public static void main(String[] args) {
//        // 示例使用
//        String bucket = "coldchain";
//        String startTime = "2024-11-01T00:00:00Z";
//        String endTime = "2024-11-30T23:59:59Z";
//        String measurement = "sensor_data";
//        String field = "temperature";
//
//        Map<String, String> filters = Map.of(
//                "device_id", "30067080",
//                "roads", "1"
//        );
//
//        String interval = "1d"; // 每天计算平均值
//        // 构造查询
//        String fluxQuery = buildTemperatureQuery(bucket, startTime, endTime, measurement, field, filters, interval);
//        // 输出 Flux 查询
//        System.out.println(fluxQuery);
//    }
}
