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

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 环境监测数据推送基类（兼容2021版）
 * 子类：温度、湿度、氧气、二氧化碳、一氧化碳
 * @author fyc
 * @email yuchuan.fu@chinausky.com
 * @date 2025/11/20
 */
@Data
public abstract class BaseEnvMonitorPushVO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 数据包ID（必填）
     * 类型：Int，长度15（0 ~ 999999999999999）
     */
    private Long dataPacketID;

    /**
     * 人防工程ID（必填）
     * 类型：Int，长度10（0 ~ 9999999999）
     */
    private Long engineeringID;

    /**
     * 物联设施ID（必填）
     * 类型：Int，长度8（0 ~ 99999999）
     */
    private Integer sensorID;

    /**
     * 监测时间（必填）
     * 类型：Time（yyyy-MM-dd HH:mm:ss.SSS）
     * 说明：1小时平均周期的末点时间（如10:00表示9:00-10:00的平均数据）
     */
    @JSONField(format = "yyyy-MM-dd HH:mm:ss.SSS")
    private LocalDateTime dataEndTime;

    /**
     * 上报时间（必填）
     * 类型：Time（yyyy-MM-dd HH:mm:ss.SSS）
     */
    @JSONField(format = "yyyy-MM-dd HH:mm:ss.SSS")
    private LocalDateTime publishTime;

    /**
     * 获取监测值（子类实现，返回具体数值）
     */
    public abstract Number getSensorValue();

    /**
     * 校验公共字段（子类需重写校验监测值）
     */
    public void validateCommon() {
        // 1. 必填字段非空校验
        if (dataPacketID == null) throw new IllegalArgumentException("数据包ID（dataPacketID）为必填项");
        if (engineeringID == null) throw new IllegalArgumentException("人防工程ID（engineeringID）为必填项");
        if (sensorID == null) throw new IllegalArgumentException("物联设施ID（sensorID）为必填项");
        if (dataEndTime == null) throw new IllegalArgumentException("监测时间（dataEndTime）为必填项");
        if (publishTime == null) throw new IllegalArgumentException("上报时间（publishTime）为必填项");

        // 2. 字段长度校验
        if (String.valueOf(dataPacketID).length() > 15) throw new IllegalArgumentException("数据包ID长度不能超过15位");
        if (String.valueOf(engineeringID).length() > 10)
            throw new IllegalArgumentException("人防工程ID长度不能超过10位");
        if (String.valueOf(sensorID).length() > 8) throw new IllegalArgumentException("物联设施ID长度不能超过8位");

        // 3. 时间逻辑校验（监测时间不能晚于上报时间）
        if (dataEndTime.isAfter(publishTime)) throw new IllegalArgumentException("监测时间不能晚于上报时间");
    }

    /**
     * 完整校验（公共字段+监测值）
     */
    public final void validate() {
        validateCommon();
        validateSensorValue();
    }

    /**
     * 校验监测值（子类重写，实现具体规则）
     */
    protected abstract void validateSensorValue();
}
