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/co
 * 说明：Float(2,2) → 0.00 ~ 99.99mg/m³
 * @author fyc
 * @email yuchuan.fu@chinausky.com
 * @date 2025/11/20
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class CoVO extends BaseEnvMonitorPushVO {

    private static final long serialVersionUID = 1L;

    /**
     * 1小时平均浓度（必填）
     * 类型：Float(2,2)，单位：mg/m³
     */
    private Float sensorValue;

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

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

        // 校验范围：0.00 ~ 99.99mg/m³（符合Float(2,2)约束）
        if (sensorValue < 0.00f || sensorValue > 99.99f) {
            throw new IllegalArgumentException("一氧化碳浓度超出范围（0.00 ~ 99.99mg/m³），当前值：" + 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();
    }
}
