package vip.xiaonuo.coldchain.modular.app.param;

import com.github.jfcloud.influxdb.flux.AggregationWindow;
import com.github.jfcloud.influxdb.util.InfluxDBDateFormatter;
import lombok.experimental.UtilityClass;
import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;

import java.util.*;

@UtilityClass
public class SensorDataTransformer {

//    public static Map<String, Object> transformToResponseFormat(List<SensorData> sensorDataList) {
//        // 使用 Java Streams API 按照字段进行分组，分别处理温度、湿度和二氧化碳
//        Map<String, Object> response = new HashMap<>();
//        // 按时间升序排序
//        List<SensorData> sortedData = sensorDataList.stream().sorted((data1, data2) -> data1.getTime().compareTo(data2.getTime())).toList();
//        // 温度 (时间 -> 温度)
//        List<Map<String, Object>> temperatureData = sortedData.stream().filter(data -> data.getTemperature() != null) // 过滤掉没有温度值的数据
//                .map(data -> {
//                    Map<String, Object> timeTemperatureMap = new HashMap<>();
//                    timeTemperatureMap.put("time", InfluxDBDateFormatter.instantToUTC8String(data.getTime()));  // 时间
//                    timeTemperatureMap.put("temperature", data.getTemperature());  // 温度
//                    return timeTemperatureMap;
//                }).collect(Collectors.toList());
//
//        // 湿度 (时间 -> 湿度)
//        List<Map<String, Object>> humidityData = sortedData.stream().filter(data -> data.getHumidity() != null) // 过滤掉没有湿度值的数据
//                .map(data -> {
//                    Map<String, Object> timeHumidityMap = new HashMap<>();
//                    timeHumidityMap.put("time", InfluxDBDateFormatter.instantToUTC8String(data.getTime()));  // 时间
//                    timeHumidityMap.put("humidity", data.getHumidity());  // 湿度
//                    return timeHumidityMap;
//                }).collect(Collectors.toList());
//
//        // 二氧化碳 (时间 -> 二氧化碳)
//        List<Map<String, Object>> co2Data = sortedData.stream().filter(data -> data.getCo2() != null) // 过滤掉没有二氧化碳值的数据
//                .map(data -> {
//                    Map<String, Object> timeCo2Map = new HashMap<>();
//                    timeCo2Map.put("time", InfluxDBDateFormatter.instantToUTC8String(data.getTime()));  // 时间
//                    timeCo2Map.put("co2", data.getCo2());  // 二氧化碳
//                    return timeCo2Map;
//                }).collect(Collectors.toList());
//
//        // 将结果按结构化的方式放入 response
//        response.put("temperature", temperatureData);
//        response.put("humidity", humidityData);
//        response.put("co2", co2Data);
//
//        return response;
//    }


    // 格式化浮动值为保留两位小数
    public static Float formatFloat(Float value) {
        if (value == null) return null;
        return Float.parseFloat(String.format("%.2f", value));
    }


    public SensorEchartData processSensorData(List<SensorData> sensorDataList, String dataType, AggregationWindow window) {
        // 按时间升序排序
        List<SensorData> sortedData = sensorDataList.stream().sorted(Comparator.comparing(SensorData::getTime)).toList();
        // 提取时间和数值
        LinkedHashSet<String> times = new LinkedHashSet<>();
        List<Float> values = new ArrayList<>();
        sortedData.stream().filter(data -> isValidData(data, dataType)).forEach(data -> {
            String x = InfluxDBDateFormatter.formatTime(data.getTime(), window);
            Float y = SensorDataTransformer.formatFloat(getDataValue(data, dataType));
            if (!times.contains(x)) {
                times.add(x);
                values.add(y);
            }
        });
        return new SensorEchartData(times, values);
    }

    // 工具方法：判断是否为有效数据
    private boolean isValidData(SensorData data, String dataType) {
        if ("temperature".equals(dataType)) return data.getTemperature() != null;
        if ("humidity".equals(dataType)) return data.getHumidity() != null;
        if ("co2".equals(dataType)) return data.getCo2() != null;
        return false;
    }

    // 工具方法：获取指定类型的数值
    private Float getDataValue(SensorData data, String dataType) {
        if ("temperature".equals(dataType)) return data.getTemperature();
        if ("humidity".equals(dataType)) return data.getHumidity();
        if ("co2".equals(dataType)) return data.getCo2();
        return null;
    }
}
