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/flooded
 * @author fyc
 * @email yuchuan.fu@chinausky.com
 * @date 2025/11/20
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class WaterLeakVO extends BaseEnvMonitorPushVO {

    private static final long serialVersionUID = 1L;

    // ====================== 水浸状态专属枚举（保留个性化定义）======================

    /**
     * 水浸状态定义（对应附录表12）
     */
    public static final class SensorValueEnum {
        public static final int NO_WATER = 0; // 无水
        public static final int HAS_WATER = 1; // 有水

        /**
         * 校验状态编码合法性
         */
        public static boolean isValid(int value) {
            return value == NO_WATER || value == HAS_WATER;
        }
    }

    // ====================== 水浸状态专属字段（仅保留个性化字段）======================
    /**
     * 最新水浸状态（必填）
     * 类型：Int，长度1（取值参考 SensorValueEnum）
     * 说明：0=无水，1=有水
     */
    private Integer sensorValue;

    // ====================== 实现父类抽象方法（个性化逻辑）======================
    @Override
    public Number getSensorValue() {
        return sensorValue;
    }

    /**
     * 个性化校验：仅校验水浸状态的合法性（公共字段校验由父类完成）
     */
    @Override
    protected void validateSensorValue() {
        // 1. 校验水浸状态非空
        if (sensorValue == null) {
            throw new IllegalArgumentException("最新水浸状态（sensorValue）为必填项");
        }

        // 2. 校验水浸状态编码合法性（对应附录表12）
        if (!SensorValueEnum.isValid(sensorValue)) {
            throw new IllegalArgumentException("最新水浸状态（sensorValue）无效，允许值：0（无水）、1（有水）");
        }
    }
}