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

/**
 * 空间对象类型枚举
 * 定义空间规则可以关联的各种空间对象类型
 * 
 * @author AI Assistant
 * @version 1.0
 * @since 2025-01-17
 */
public enum SpatialObjectType {
    /**
     * 关联机场区域
     * 规则应用于特定的机场区域（跑道、滑行道、停机坪等）
     */
    AREA("区域", "关联到airport_areas表中定义的机场区域"),
    
    /**
     * 关联道路
     * 规则应用于特定的道路或路径
     */
    ROAD("道路", "关联到roads表中定义的道路"),
    
    /**
     * 关联路口
     * 规则应用于特定的路口或交叉点
     */
    INTERSECTION("路口", "关联到intersections表中定义的路口"),
    
    /**
     * 自定义几何形状
     * 规则应用于自定义绘制的几何区域
     */
    CUSTOM_GEOMETRY("自定义几何", "使用custom_geometry字段定义的自定义几何形状");

    private final String displayName;
    private final String description;

    SpatialObjectType(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 SpatialObjectType fromString(String name) {
        if (name == null || name.trim().isEmpty()) {
            return null;
        }
        
        try {
            return SpatialObjectType.valueOf(name.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    /**
     * 检查是否需要关联外部对象ID
     * @return 如果需要关联外部对象ID返回true
     */
    public boolean requiresExternalId() {
        return this != CUSTOM_GEOMETRY;
    }

    /**
     * 检查是否需要自定义几何形状
     * @return 如果需要自定义几何形状返回true
     */
    public boolean requiresCustomGeometry() {
        return this == CUSTOM_GEOMETRY;
    }

    /**
     * 获取关联的表名
     * @return 关联的数据库表名，如果是自定义几何则返回null
     */
    public String getRelatedTableName() {
        switch (this) {
            case AREA:
                return "airport_areas";
            case ROAD:
                return "roads";
            case INTERSECTION:
                return "intersections";
            case CUSTOM_GEOMETRY:
            default:
                return null;
        }
    }

    /**
     * 获取关联的外键字段名
     * @return 关联的外键字段名，如果是自定义几何则返回null
     */
    public String getForeignKeyFieldName() {
        switch (this) {
            case AREA:
                return "area_id";
            case ROAD:
                return "road_id";
            case INTERSECTION:
                return "intersection_id";
            case CUSTOM_GEOMETRY:
            default:
                return null;
        }
    }

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