package com.lingniu.ingest.api.event;

import java.util.List;
import java.util.Set;

/**
 * 报警事件载荷，跨协议归一。
 *
 * @param level         报警最高等级
 * @param alarmTypeCode 协议原始 alarm type 编码（按协议自定义），可用于联查协议规范
 * @param alarmTypeName 报警类型名称，如 {@code GB32960_ALARM}
 * @param faultCodes    故障代码列表（协议私有编码字符串化，便于下游去重/聚合）
 * @param activeBits    结构化的通用报警位集合（2016 版：0~15；2025 版：0~27），对照 GB/T 32960.3 表 24
 * @param longitude     经度（可选，若事件伴随位置）
 * @param latitude      纬度（可选）
 * @param safetyCategory 内部安全分类。氢气泄露独立成类，不与普通故障混用
 * @param hydrogenLeakDetected 是否检测到氢气泄露
 * @param hydrogenLeakLevel 氢气泄露等级
 * @param hydrogenLeakActionRequired 是否需要立即处置
 */
public record AlarmPayload(
        AlarmLevel level,
        int alarmTypeCode,
        String alarmTypeName,
        List<String> faultCodes,
        Set<String> activeBits,
        Double longitude,
        Double latitude,
        SafetyCategory safetyCategory,
        boolean hydrogenLeakDetected,
        HydrogenLeakLevel hydrogenLeakLevel,
        boolean hydrogenLeakActionRequired
) {
    /**
     * 报警等级（归一化的跨协议分类）。
     *
     * <ul>
     *   <li>{@link #INFO}：提示级（对应 GB/T 32960.3 0/无故障）
     *   <li>{@link #MINOR}：1 级 —— 不影响车辆正常行驶
     *   <li>{@link #MAJOR}：2 级 —— 影响车辆性能，需驾驶员限制行驶
     *   <li>{@link #CRITICAL}：3 级（驾驶员应立即停车）或 4 级（热事件最高级）
     * </ul>
     */
    public enum AlarmLevel { INFO, MINOR, MAJOR, CRITICAL }

    /**
     * 面向运营统计的内部安全分类。
     */
    public enum SafetyCategory {
        GENERAL,
        TANK_PRESSURE,
        TANK_TEMPERATURE,
        HYDROGEN_LEAK
    }

    /**
     * 氢气泄露内部等级。明确泄露信号一律视为 CRITICAL。
     */
    public enum HydrogenLeakLevel {
        NONE,
        WARNING,
        CRITICAL,
        UNKNOWN
    }
}
