package com.ruoyi.ems.domain;

import com.huashe.common.annotation.Excel;
import com.huashe.common.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;

/**
 * 告警规则对象 adm_op_alarm_rule
 *
 * 【设计说明】
 * 1. 统一的规则配置，可同时用于实时监测和巡检
 * 2. 支持多种检查类型：范围、等值、非空、在线状态、变化率
 * 3. 支持告警冷却、连续触发等高级特性
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class AlarmRule extends BaseEntity {
    private static final long serialVersionUID = 1L;

    private Long id;

    /** 规则代码 */
    @Excel(name = "规则代码")
    private String ruleCode;

    /** 规则名称 */
    @Excel(name = "规则名称")
    private String ruleName;

    /** 适用区域代码(空则全局) */
    private String areaCode;

    /** 区域名称 */
    private String areaName;

    /** 目标类型 0:区域 1:设施 2:设备 */
    @Excel(name = "目标类型", readConverterExp = "0=区域,1=设施,2=设备")
    private Integer targetType;

    /** 目标范围(JSON数组) */
    private String targetScope;

    /** 解析后的目标范围列表 */
    private List<String> targetScopeList;

    /** 设备模型代码(空则不限) */
    private String deviceModel;

    /** 设备模型名称 */
    private String deviceModelName;

    /** 监测属性标识 */
    @Excel(name = "监测属性")
    private String attrKey;

    /** 属性名称 */
    @Excel(name = "属性名称")
    private String attrName;

    /**
     * 检查类型
     * 1:范围 2:等值 3:非空 4:在线状态 5:变化率
     */
    @Excel(name = "检查类型", readConverterExp = "1=范围,2=等值,3=非空,4=在线状态,5=变化率")
    private Integer checkType;

    /** 比较操作符 GT/GE/LT/LE/EQ/NE/RANGE/IN */
    private String operator;

    /** 阈值(单值或JSON) */
    private String thresholdValue;

    /** 最小阈值(范围检查) */
    private String thresholdMin;

    /** 最大阈值(范围检查) */
    private String thresholdMax;

    /** 告警级别 1:一般 2:重要 3:紧急 */
    @Excel(name = "告警级别", readConverterExp = "1=一般,2=重要,3=紧急")
    private Integer alarmLevel;

    /** 告警代码(用于分类) */
    @Excel(name = "告警代码")
    private String alarmCode;

    /** 告警消息模板(支持变量替换) */
    private String alarmMsgTemplate;

    /** 是否检查恢复 0:否 1:是 */
    private Integer recoveryCheck;

    /** 恢复阈值 */
    private String recoveryThreshold;

    /** 触发次数(连续N次满足才告警) */
    private Integer triggerCount;

    /** 触发间隔(秒,防抖) */
    private Integer triggerInterval;

    /** 冷却时间(秒,同一规则同一对象) */
    private Integer coolDown;

    /** 是否启用 0:禁用 1:启用 */
    @Excel(name = "是否启用", readConverterExp = "0=禁用,1=启用")
    private Integer enabled;

    /** 是否用于巡检 0:否 1:是 */
    private Integer useForInspection;

    /** 是否用于实时监测 0:否 1:是 */
    private Integer useForRealtime;

    /** 所属子系统代码 */
    private String subsystemCode;

    /** 子系统名称 */
    private String subsystemName;

    /** 规则优先级(数值小优先) */
    private Integer ruleOrder;

    /** 规则描述 */
    private String description;

    /** 所属分组列表 */
    private List<String> groupCodes;

    // ==================== 检查类型常量 ====================

    public static final int CHECK_TYPE_RANGE = 1;
    public static final int CHECK_TYPE_EQUAL = 2;
    public static final int CHECK_TYPE_NOT_NULL = 3;
    public static final int CHECK_TYPE_ONLINE = 4;
    public static final int CHECK_TYPE_CHANGE_RATE = 5;

    // ==================== 操作符常量 ====================

    public static final String OP_GT = "GT";   // 大于
    public static final String OP_GE = "GE";   // 大于等于
    public static final String OP_LT = "LT";   // 小于
    public static final String OP_LE = "LE";   // 小于等于
    public static final String OP_EQ = "EQ";   // 等于
    public static final String OP_NE = "NE";   // 不等于
    public static final String OP_RANGE = "RANGE"; // 范围
    public static final String OP_IN = "IN";   // 包含

    // ==================== 告警级别常量 ====================

    public static final int LEVEL_NORMAL = 1;   // 一般
    public static final int LEVEL_IMPORTANT = 2; // 重要
    public static final int LEVEL_URGENT = 3;    // 紧急

    /**
     * 获取格式化的阈值显示
     */
    public String getThresholdDisplay() {
        if (checkType == null) {
            return "-";
        }
        switch (checkType) {
            case CHECK_TYPE_RANGE:
                String min = thresholdMin != null ? thresholdMin : "-∞";
                String max = thresholdMax != null ? thresholdMax : "+∞";
                return min + " ~ " + max;
            case CHECK_TYPE_EQUAL:
            case CHECK_TYPE_ONLINE:
                return "= " + (thresholdValue != null ? thresholdValue : "");
            case CHECK_TYPE_NOT_NULL:
                return "非空";
            default:
                return thresholdValue != null ? thresholdValue : "-";
        }
    }

    /**
     * 获取告警级别描述
     */
    public String getAlarmLevelDesc() {
        if (alarmLevel == null) {
            return "未知";
        }
        switch (alarmLevel) {
            case LEVEL_NORMAL:
                return "一般";
            case LEVEL_IMPORTANT:
                return "重要";
            case LEVEL_URGENT:
                return "紧急";
            default:
                return "未知";
        }
    }
}