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/co2
 * 说明：Float(0,3) → 无整数位，3位小数（如 0.123mg/m³，范围：0.000 ~ 0.999）
 * @author fyc
 * @email yuchuan.fu@chinausky.com
 * @date 2025/11/20
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class Co2VO extends BaseEnvMonitorPushVO {

    private static final long serialVersionUID = 1L;

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

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

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

        // 校验范围：0.000 ~ 0.999mg/m³（符合Float(0,3)约束）
        if (sensorValue < 0.000f || sensorValue > 0.999f) {
            throw new IllegalArgumentException("二氧化碳浓度超出范围（0.000 ~ 0.999mg/m³），当前值：" + sensorValue);
        }

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

    private int getDecimalDigits(float value) {
        String str = String.valueOf(value);
        if (!str.contains(".")) return 0;
        String decimalPart = str.split("\\.")[1];
        // 处理科学计数法（如 1.234E-4 → 0.0001234）
        if (decimalPart.contains("E")) {
            return 6;
            // 科学计数法默认按超3位处理
        }
        return decimalPart.length();
    }
}
