package com.usky.cdi.service.vo.info;

import com.usky.cdi.service.vo.base.BaseEnvMonitorPushVO;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 空气温度推送VO（兼容2021版）
 * MQTT Topic：iotInfo/temp
 * 说明：Float(2,2) → 总长度2位，小数位2位（如 18.50℃，范围：-99.99 ~ 99.99）
 * @author fyc
 * @email yuchuan.fu@chinausky.com
 * @date 2025/11/20
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class TempVO extends BaseEnvMonitorPushVO {

    private static final long serialVersionUID = 1L;

    /**
     * 温度（必填）
     * 类型：Float(2,2)，单位：℃
     */
    private Float sensorValue;

    @Override
    public Number getSensorValue() {
        return sensorValue;
    }

    @Override
    protected void validateSensorValue() {
        if (sensorValue == null) throw new IllegalArgumentException("温度（sensorValue）为必填项");

        // 校验范围：-99.99 ~ 99.99（符合Float(2,2)长度约束）
        if (sensorValue < -99.99f || sensorValue > 99.99f) {
            throw new IllegalArgumentException("温度值超出范围（-99.99 ~ 99.99℃），当前值：" + sensorValue);
        }

        // 校验小数位：最多2位
        if (getDecimalDigits(sensorValue) > 2) {
            throw new IllegalArgumentException("温度值小数位不能超过2位，当前值：" + sensorValue);
        }
    }

    /**
     * 辅助方法：获取小数位数
     */
    private int getDecimalDigits(float value) {
        String str = String.valueOf(value);
        if (!str.contains(".")) return 0;
        return str.split("\\.")[1].length();
    }
}
