package com.usky.cdi.service.enums;

/**
 * 告警类型枚举类
 * 统一管理告警类型定义、分类和转换逻辑
 *
 * @author fu
 * @since 2025-12-29
 */
public enum AlarmType {

    // 水浸告警
    WATER("701", "10.1", null, "有水"),

    // 空气温度偏高告警
    AIR_TEMP("702", "12.1", Category.THRESHOLD, "空气温度偏高"),

    // 空气湿度偏高告警
    AIR_HUMIDITY("703", "13.1", Category.THRESHOLD, "空气湿度偏高"),

    // 氧气浓度偏低告警
    OXYGEN_LOW("704", "14.1", Category.THRESHOLD, "氧气浓度偏低"),

    // 二氧化碳浓度偏高告警
    CO2_HIGH("705", "15.1", Category.THRESHOLD, "二氧化碳浓度偏高"),

    // 一氧化碳浓度偏高告警
    CO_HIGH("706", "16.1", Category.THRESHOLD, "一氧化碳浓度偏高"),

    // 剩余电流偏大告警
    RESIDUAL_CURRENT("707", "29.1", Category.THRESHOLD_LINE, "剩余电流偏大"),

    // 供电电缆温度偏高告警
    CABLE_TEMP("708", "29.2", Category.THRESHOLD_LINE, "供电电缆温度偏高"),

    // 电流偏大
    CURRENT_HIGH("709", "29.3", Category.THRESHOLD_LINE, "电流偏大"),

    // 人员闯入告警
    PERSON_INTRUSION("710", "33.1", Category.OTHER, "人员闯入告警"),

    // 监测位置有位移告警
    DISPLACEMENT("711", "37.1", Category.STRUCTURE_MONITORING, "有位移"),

    // 监测位置有倾斜告警
    TILT("712", "34.1", Category.STRUCTURE_MONITORING, "有倾斜"),

    // 裂缝检测告警
    CRACK("713", "36.1", Category.STRUCTURE_MONITORING, "有裂缝"),

    // 集水井水位偏高
    SEWAGE_LEVEL("716", "11.1", Category.STRUCTURE_MONITORING, "集水井水位偏高");

    private final String originalCode;
    private final String mappedCode;
    private final Category category;
    private final String description;

    AlarmType(String originalCode, String mappedCode, Category category, String description) {
        this.originalCode = originalCode;
        this.mappedCode = mappedCode;
        this.category = category;
        this.description = description;
    }

    /**
     * 根据原始告警类型代码获取对应的枚举值
     */
    public static AlarmType fromOriginalCode(String originalCode) {
        for (AlarmType alarmType : values()) {
            if (alarmType.getOriginalCode().equals(originalCode)) {
                return alarmType;
            }
        }
        return null;
    }

    /**
     * 判断是否为结构监测告警类型（需要unitName映射）
     */
    public boolean isStructureMonitoringType() {
        return category == Category.STRUCTURE_MONITORING;
    }

    /**
     * 判断是否为阈值相关告警类型
     */
    public boolean isThresholdAlarmType() {
        return category == Category.THRESHOLD || category == Category.THRESHOLD_LINE;
    }

    /**
     * 判断是否为线路编号相关告警类型
     */
    public boolean isLineNoAlarmType() {
        return category == Category.THRESHOLD_LINE;
    }

    /**
     * 获取默认unitName值
     */
    public String getDefaultUnitName() {
        // switch (this) {
        //     case DISPLACEMENT:
        //         return "监测位置";
        //     case TILT:
        //         return "倾斜监测点";
        //     case CRACK:
        //         return "裂缝检测点";
        //     default:
        return "防化单元";
        // }
    }

    /**
     * 获取默认阈值
     */
    public Float getDefaultThreshold() {
        switch (this) {
            case AIR_TEMP:
                return 40.0f; // 35°C
            case AIR_HUMIDITY:
                return 95.0f; // 80%
            case OXYGEN_LOW:
                return 19.5f; // 19.5%
            case CO2_HIGH:
                return 1000.0f; // 0.5%
            case CO_HIGH:
                return 5.0f; // 10ppm
            case RESIDUAL_CURRENT:
                return 10.0f; // 300mA
            case CABLE_TEMP:
                return 55.0f; // 70°C
            case CURRENT_HIGH:
                return 10000.0f; // 10000mA
            default:
                return 0.0f;
        }
    }

    /**
     * 验证阈值是否在合理范围内
     */
    public boolean isValidThreshold(float value) {
        switch (this) {
            case AIR_TEMP:
                return value >= -20 && value <= 80; // 温度范围 -50°C 到 100°C
            case AIR_HUMIDITY:
                return value >= 0 && value <= 100; // 湿度范围 0% 到 100%
            case OXYGEN_LOW:
                return value >= 0 && value <= 25; // 氧气浓度范围 0% 到 25%
            case CO2_HIGH:
                return value >= 0 && value <= 5; // 二氧化碳浓度范围 0% 到 10%
            case CO_HIGH:
                return value >= 0 && value <= 2000; // 一氧化碳浓度范围 0 到 1000ppm
            case RESIDUAL_CURRENT:
                return value >= 0 && value <= 500000; // 剩余电流范围 0 到 5000mA
            case CABLE_TEMP:
                return value >= -50 && value <= 200; // 电缆温度范围 -50°C 到 200°C
            case CURRENT_HIGH:
                return value >= 0 && value <= 100000; // 电流范围 0 到 1000A
            default:
                return true; // 其他类型不进行验证
        }
    }

    /**
     * 告警分类枚举
     */
    public enum Category {
        STRUCTURE_MONITORING,    // 结构监测类型（需要unitName映射）
        THRESHOLD,              // 阈值告警类型（需要thresholding）
        THRESHOLD_LINE,         // 阈值+线路编号类型（需要thresholding和lineNo）
        OTHER                   // 其他类型
    }

    // Getters
    public String getOriginalCode() {
        return originalCode;
    }

    public String getMappedCode() {
        return mappedCode;
    }

    public Category getCategory() {
        return category;
    }

    public String getDescription() {
        return description;
    }
}