package com.usky.cdi.service.util;

import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Random;

/**
 * 固定水位生成器 - 为液位传感器(716)生成模拟数据
 * <p>
 * 修复说明：
 * 1. HashMap 改为 ConcurrentHashMap，解决并发安全问题
 * 2. 移除 containsValue 死循环风险，改用基于设备ID哈希的确定性算法，
 *    保证每个设备获得唯一且稳定的水位值，不受设备数量限制
 *
 * @author fyc
 * @email yuchuan.fu@chinausky.com
 * @date 2026/4/28
 */

/**
 * 固定水位值生成器：
 * 1. 每台设备首次调用时基于设备ID生成一个随机水位值
 * 2. 同一设备后续调用直接取缓存，保持一致
 * 3. 不同设备之间数值随机分散
 */
@Slf4j
public class FixedWaterLevelGenerator {

    private static final Map<String, Double> DEVICE_LEVEL_MAP = new ConcurrentHashMap<>();

    private static final double MIN_VALUE = 0.02;
    private static final double MAX_VALUE = 0.05;

    public static double getSensorValue(String deviceId) {
        return DEVICE_LEVEL_MAP.computeIfAbsent(deviceId, FixedWaterLevelGenerator::computeFixedValue);
    }

    private static double computeFixedValue(String deviceId) {
        // 乘以一个大的质数，打乱原本连续ID的哈希值分布
        long seed = (deviceId.hashCode() * 2654435761L) & 0xFFFFFFFFL;
        Random random = new Random(seed);

        double value = MIN_VALUE + random.nextDouble() * (MAX_VALUE - MIN_VALUE);
        log.info("生成设备[{}]的固定水位值：{}", deviceId, value);
        return Math.round(value * 1000) / 1000.0;
    }
}