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

/**
 * 违规类型枚举
 * 定义各种规则违规的具体类型
 * 
 * @author AI Assistant
 * @version 1.0
 * @since 2025-01-17
 */
public enum ViolationType {
    /**
     * 未授权进入 (对应数据库值: ACCESS)
     * 车辆未经授权进入受限区域
     */
    ACCESS("未授权进入", "车辆未经授权进入受限区域"),

    /**
     * 超速违规 (对应数据库值: SPEED)
     * 车辆速度超过区域限制
     */
    SPEED("超速违规", "车辆速度超过区域限制"),

    /**
     * 高度限制违规 (对应数据库值: HEIGHT)
     * 车辆高度超过区域限制
     */
    HEIGHT("高度限制违规", "车辆高度超过区域限制"),

    /**
     * 重量限制违规 (对应数据库值: WEIGHT)
     * 车辆重量超过区域限制
     */
    WEIGHT("重量限制违规", "车辆重量超过区域限制"),

    /**
     * 其他违规 (对应数据库值: OTHER)
     * 其他类型的违规行为
     */
    OTHER("其他违规", "其他类型的违规行为"),

    // === 以下为扩展违规类型，不直接存储到 uv_violation_events 表，映射到 OTHER ===

    /**
     * 车辆类型违规
     * 不被允许的车辆类型进入特定区域
     */
    VEHICLE_TYPE("车辆类型违规", "不被允许的车辆类型进入特定区域"),
    
    /**
     * 时间限制违规
     * 在非允许时间段内进入或停留
     */
    TIME_RESTRICTION("时间限制违规", "在非允许时间段内进入或停留"),
    
    /**
     * 优先级违规
     * 低优先级车辆阻挡高优先级车辆通行
     */
    PRIORITY("优先级违规", "低优先级车辆阻挡高优先级车辆通行"),
    
    /**
     * 安全区域违规
     * 违反安全区域的特殊规定
     */
    SAFETY_ZONE("安全区域违规", "违反安全区域的特殊规定"),
    
    /**
     * 停留时间超限
     * 在特定区域停留时间超过允许限制
     */
    DWELL_TIME("停留时间超限", "在特定区域停留时间超过允许限制"),
    
    /**
     * 路径偏离
     * 车辆偏离指定路径或航线
     */
    PATH_DEVIATION("路径偏离", "车辆偏离指定路径或航线"),
    
    /**
     * 自定义规则违规
     * 违反用户自定义的特殊规则
     */
    CUSTOM_RULE("自定义规则违规", "违反用户自定义的特殊规则");

    private final String displayName;
    private final String description;

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

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

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

    /**
     * 获取数据库存储值
     * 将枚举值映射到数据库约束允许的字符串值
     * @return 数据库存储的字符串值
     */
    public String getDatabaseValue() {
        switch (this) {
            case ACCESS:
                return "ACCESS";
            case SPEED:
                return "SPEED";
            case HEIGHT:
                return "HEIGHT";
            case WEIGHT:
                return "WEIGHT";
            case OTHER:
                return "OTHER";
            // 扩展类型都映射到 OTHER
            case VEHICLE_TYPE:
            case TIME_RESTRICTION:
            case PRIORITY:
            case SAFETY_ZONE:
            case DWELL_TIME:
            case PATH_DEVIATION:
            case CUSTOM_RULE:
            default:
                return "OTHER";
        }
    }

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

        try {
            return ViolationType.valueOf(name.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    /**
     * 根据规则分类推断可能的违规类型
     * @param ruleCategory 规则分类
     * @return 对应的主要违规类型
     */
    public static ViolationType fromRuleCategory(RuleCategory ruleCategory) {
        if (ruleCategory == null) {
            return OTHER;
        }

        switch (ruleCategory) {
            case ACCESS_CONTROL:
                return ACCESS;
            case SPEED_LIMIT:
                return SPEED;
            case VEHICLE_RESTRICTION:
                return VEHICLE_TYPE; // 扩展类型，映射到 OTHER
            case HEIGHT_LIMIT:
                return HEIGHT;
            case WEIGHT_LIMIT:
                return WEIGHT;
            case TIME_RESTRICTION:
                return TIME_RESTRICTION; // 扩展类型，映射到 OTHER
            case PRIORITY_CONTROL:
                return PRIORITY; // 扩展类型，映射到 OTHER
            case SAFETY_ZONE:
                return SAFETY_ZONE; // 扩展类型，映射到 OTHER
            case CUSTOM:
            default:
                return OTHER;
        }
    }

    /**
     * 检查是否为安全关键违规
     * @return 如果是安全关键违规返回true
     */
    public boolean isSafetyCritical() {
        switch (this) {
            case ACCESS:
            case SAFETY_ZONE:
            case PRIORITY:
                return true;
            default:
                return false;
        }
    }

    /**
     * 检查是否为物理限制违规
     * @return 如果是物理限制违规返回true
     */
    public boolean isPhysicalLimitViolation() {
        switch (this) {
            case SPEED:
            case HEIGHT:
            case WEIGHT:
                return true;
            default:
                return false;
        }
    }

    /**
     * 检查是否为访问控制违规
     * @return 如果是访问控制违规返回true
     */
    public boolean isAccessControlViolation() {
        switch (this) {
            case ACCESS:
            case VEHICLE_TYPE:
            case TIME_RESTRICTION:
                return true;
            default:
                return false;
        }
    }

    /**
     * 获取违规的严重程度评分
     * @return 严重程度评分（1-10，数值越高越严重）
     */
    public int getSeverityScore() {
        switch (this) {
            case SAFETY_ZONE:
                return 10;
            case ACCESS:
                return 9;
            case PRIORITY:
                return 8;
            case VEHICLE_TYPE:
                return 7;
            case SPEED:
                return 6;
            case HEIGHT:
            case WEIGHT:
                return 5;
            case TIME_RESTRICTION:
                return 4;
            case DWELL_TIME:
                return 3;
            case PATH_DEVIATION:
                return 2;
            case OTHER:
            default:
                return 1;
        }
    }

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