package com.qaup.collision.common.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.locationtech.jts.geom.Point;

@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class MovingObject {

    /**
     * 对象唯一标识
     */
    private String objectId;

    /**
     * 对象类型
     */
    private MovingObjectType objectType;

    /**
     * 对象名称（车牌号或航班号）
     */
    private String objectName;

    /**
     * 当前位置
     */
    private Point currentPosition;

    /**
     * 当前速度 (km/h)
     */
    private Double currentSpeed;

    /**
     * 当前方向角 (度，0-360)
     */
    private Double currentHeading;

    /**
     * 高度（米）
     */
    private Double altitude;

    /**
     * 对象类型枚举 - 四种基本分类
     */
    public enum MovingObjectType {
        UNMANNED_VEHICLE("UV"),   // 无人车
        AIRCRAFT("AC"),           // 航空器  
        SPECIAL_VEHICLE("SP"),    // 特勤车
        NORMAL_VEHICLE("NM");     // 普通车
        
        private final String typeCode;
        
        MovingObjectType(String typeCode) {
            this.typeCode = typeCode;
        }
        
        public String getTypeCode() {
            return typeCode;
        }
        
        /**
         * 根据类型编码获取对象类型
         */
        public static MovingObjectType fromTypeCode(String typeCode) {
            for (MovingObjectType type : values()) {
                if (type.typeCode.equals(typeCode)) {
                    return type;
                }
            }
            throw new IllegalArgumentException("Unknown type code: " + typeCode);
        }
        
        /**
         * 是否需要数据持久化
         */
        public boolean shouldPersist() {
            return this == UNMANNED_VEHICLE;
        }
    }

    /**
     * 获取速度（m/s）
     */
    public double getSpeedInMetersPerSecond() {
        if (currentSpeed == null) {
            return 0.0;
        }
        return currentSpeed * 1000.0 / 3600.0; // km/h to m/s
    }

    /**
     * 判断是否在移动
     */
    public boolean isMoving() {
        return currentSpeed != null && currentSpeed > 0.5; // 0.5 km/h作为阈值
    }
}
