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

    private static final long serialVersionUID = 1L;

    // ====================== 人员闯入状态专属枚举（对应附录表19）======================
    public static final class SensorValueEnum {
        public static final int NO_INTRUSION = 0; // 无人员闯入
        public static final int INTRUSION = 1;    // 有人员闯入

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

    // ====================== 专属字段（父类已包含公共字段）======================
    /**
     * 人员闯入状态（必填）
     * 类型：Int，长度1（取值参考 SensorValueEnum）
     */
    private Integer sensorValue;

    // ====================== 实现父类抽象方法 ======================
    @Override
    public Number getSensorValue() {
        return sensorValue;
    }

    @Override
    protected void validateSensorValue() {
        // 1. 非空校验
        if (sensorValue == null) {
            throw new IllegalArgumentException("人员闯入状态（sensorValue）为必填项");
        }

        // 2. 状态合法性校验
        if (!SensorValueEnum.isValid(sensorValue)) {
            throw new IllegalArgumentException("人员闯入状态（sensorValue）无效，允许值：0（无闯入）、1（有闯入）");
        }
    }
}