package com.qaup.collision.rule.model.enums;

/**
 * 空间规则分类枚举
 * 定义统一规则引擎支持的所有安全规则类型
 * 
 * @author AI Assistant
 * @version 1.0
 * @since 2025-01-17
 */
public enum RuleCategory {
    /**
     * 准入控制规则（电子围栏类型）
     * 控制车辆/航空器是否可以进入特定区域
     */
    ACCESS_CONTROL("准入控制", "控制车辆进入和离开特定区域的权限"),
    
    /**
     * 速度限制规则
     * 限制在特定区域或道路上的最大/最小速度
     */
    SPEED_LIMIT("速度限制", "控制在特定空间区域内的速度限制"),
    
    /**
     * 车辆类型限制规则
     * 限制特定类型的车辆在某些区域的访问权限
     */
    VEHICLE_RESTRICTION("车辆限制", "限制特定类型车辆的区域访问权限"),
    
    /**
     * 高度限制规则
     * 限制车辆或设备的最大高度
     */
    HEIGHT_LIMIT("高度限制", "控制车辆或设备的高度限制"),
    
    /**
     * 重量限制规则
     * 限制车辆的最大载重或总重量
     */
    WEIGHT_LIMIT("重量限制", "控制车辆的重量限制"),
    
    /**
     * 时间限制规则
     * 基于时间段的访问控制规则
     */
    TIME_RESTRICTION("时间限制", "基于时间窗口的访问控制"),
    
    /**
     * 优先级控制规则
     * 控制不同对象的通行优先级
     */
    PRIORITY_CONTROL("优先级控制", "控制不同车辆类型的通行优先级"),
    
    /**
     * 安全区域规则
     * 特殊的安全保护区域规则
     */
    SAFETY_ZONE("安全区域", "特殊安全保护区域的管控规则"),
    
    /**
     * 自定义规则
     * 用户自定义的特殊规则类型
     */
    CUSTOM("自定义规则", "用户自定义的特殊业务规则");

    private final String displayName;
    private final String description;

    RuleCategory(String displayName, String description) {
        this.displayName = displayName;
        this.description = description;
    }

    /**
     * 获取规则分类的显示名称
     * @return 显示名称
     */
    public String getDisplayName() {
        return displayName;
    }

    /**
     * 获取规则分类的描述信息
     * @return 描述信息
     */
    public String getDescription() {
        return description;
    }

    /**
     * 根据字符串名称获取规则分类
     * @param name 规则分类名称
     * @return 对应的规则分类枚举，如果不存在则返回null
     */
    public static RuleCategory fromString(String name) {
        if (name == null || name.trim().isEmpty()) {
            return null;
        }
        
        try {
            return RuleCategory.valueOf(name.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    /**
     * 检查是否为访问控制类规则
     * @return 如果是访问控制类规则返回true
     */
    public boolean isAccessControlType() {
        return this == ACCESS_CONTROL || this == VEHICLE_RESTRICTION || this == TIME_RESTRICTION;
    }

    /**
     * 检查是否为物理限制类规则
     * @return 如果是物理限制类规则返回true
     */
    public boolean isPhysicalLimitType() {
        return this == SPEED_LIMIT || this == HEIGHT_LIMIT || this == WEIGHT_LIMIT;
    }

    /**
     * 检查是否为安全控制类规则
     * @return 如果是安全控制类规则返回true
     */
    public boolean isSafetyControlType() {
        return this == PRIORITY_CONTROL || this == SAFETY_ZONE;
    }

    @Override
    public String toString() {
        return String.format("%s(%s)", name(), displayName);
    }
} 