package com.usky.cdi.service.enums;

import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
/**
 *
 * @author fyc
 * @email yuchuan.fu@chinausky.com
 * @date 2026/2/5
 */

/**
 * 人防投递日志-数据类型枚举（对应cdi_delivery_log表的data_type字段）
 */
public enum DeliveryDataType {

    /**
     * 防护单元基础信息
     */
    BASE_DATA(1, "防护单元基础信息"),

    /**
     * 楼层平面图信息
     */
    IOT_MONITOR_DATA(2, "楼层平面图信息"),

    /**
     * 智能监管物联设施信息
     */
    HIDDEN_DANGER(3, "智能监管物联设施信息");




    /**
     * 数据库存储的编码（对应data_type字段值）
     */
    private final Integer code;

    /**
     * 编码对应的业务描述
     */
    private final String desc;

    // 构造方法（枚举类构造方法默认私有，无需显式写private）
    DeliveryDataType(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    // ========== 基础getter方法 ==========
    public Integer getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    public static Map<Integer, String> getAllDesc() {
        return Arrays.stream(values())
                .collect(java.util.stream.Collectors.toMap(DeliveryDataType::getCode, DeliveryDataType::getDesc));
    }

    // ========== 核心工具方法（日常开发高频使用） ==========

    /**
     * 根据编码获取对应的枚举对象（推荐使用，空值/无效编码返回Optional.empty()，避免空指针）
     * @param code 数据类型编码（1/2/3）
     * @return 对应枚举的Optional对象
     */
    public static Optional<DeliveryDataType> getByCode(Integer code) {
        // 空值直接返回空，避免遍历判断
        if (code == null) {
            return Optional.empty();
        }
        // 遍历枚举数组匹配编码
        return Arrays.stream(values())
                .filter(enumObj -> enumObj.getCode().equals(code))
                .findFirst();
    }

    /**
     * 根据编码获取描述（简化版，无匹配返回空字符串，适合接口返回/日志打印）
     * @param code 数据类型编码（1/2/3）
     * @return 编码对应的描述，无匹配返回""
     */
    public static String getDescByCode(Integer code) {
        return getByCode(code)
                .map(DeliveryDataType::getDesc)
                .orElse("");
    }

    /**
     * 判断编码是否为有效的数据类型编码（适合入参校验/数据校验）
     * @param code 数据类型编码
     * @return true-有效，false-无效/空值
     */
    public static boolean isValidCode(Integer code) {
        return getByCode(code).isPresent();
    }
}