package com.qaup.collision.common.model.spatial;

import com.qaup.collision.common.model.MovingObject.MovingObjectType;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import org.locationtech.jts.geom.Point;

import java.time.LocalDateTime;

/**
 * 车辆位置PostGIS实体类（规范化版本）
 * 
 * 用于存储车辆的实时位置信息，符合数据库规范化设计
 * 只存储位置相关数据，车辆基础信息通过关联查询获取
 */
@Entity
@Table(name = "vehicle_locations")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class VehicleLocation {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    /**
     * 车辆ID（数字主键，关联sys_vehicle_info.vehicle_id）
     */
    @Column(name = "vehicle_id", nullable = false)
    private Long vehicleId;
    
    /**
     * 位置点 - 使用PostGIS POINT类型
     * SRID 4326表示WGS84坐标系统（GPS坐标）
     */
    @Column(name = "location", nullable = false, columnDefinition = "geometry(Point,4326)")
    private Point location;
    
    /**
     * 高度信息（米）
     */
    @Column(name = "altitude")
    private Double altitude;
    
    /**
     * 航向角（度，0-360）
     */
    @Column(name = "heading")
    private Double heading;
    
    /**
     * 速度（公里/小时）
     */
    @Column(name = "speed")
    private Double speed;
    
    /**
     * 数据时间戳
     */
    @Column(name = "timestamp", nullable = false)
    private LocalDateTime timestamp;
    
    /**
     * 数据质量标识
     */
    @Column(name = "data_quality", length = 20)
    private String dataQuality;
    
    /**
     * 创建时间
     */
    @Column(name = "created_at")
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
    
    // ============================================
    // 运行时属性 - 不存储在数据库中
    // ============================================
    
    /**
     * 车辆类型（运行时属性，不存储在数据库中）
     * 通过QuapDataAdapter从sys_vehicle_info表获取
     */
    @Transient
    private MovingObjectType vehicleType;
    
    /**
     * 车牌号（运行时属性，不存储在数据库中）
     * 通过QuapDataAdapter从sys_vehicle_info表获取
     */
    @Transient
    private String licensePlate;
    
    /**
     * 预设置创建和更新时间
     */
    @PrePersist
    protected void onCreate() {
        createdAt = LocalDateTime.now();
        updatedAt = LocalDateTime.now();
    }
    
    @PreUpdate
    protected void onUpdate() {
        updatedAt = LocalDateTime.now();
    }
    
    // ============================================
    // 便捷方法
    // ============================================
    
    /**
     * 设置车辆类型（用于运行时设置）
     * 
     * @param vehicleType 车辆类型
     */
    public void setVehicleType(MovingObjectType vehicleType) {
        this.vehicleType = vehicleType;
    }
    
    /**
     * 获取车辆类型
     * 如果未设置运行时类型，默认返回UNMANNED_VEHICLE（因为只有无人车数据会持久化）
     * 
     * @return 车辆类型
     */
    public MovingObjectType getVehicleType() {
        // 如果已设置运行时类型，返回该类型
        if (this.vehicleType != null) {
            return this.vehicleType;
        }
        // 由于数据库中只存储无人车数据，默认返回UNMANNED_VEHICLE
        return MovingObjectType.UNMANNED_VEHICLE;
    }
    
    /**
     * 设置车牌号（用于运行时设置）
     * 
     * @param licensePlate 车牌号
     */
    public void setLicensePlate(String licensePlate) {
        this.licensePlate = licensePlate;
    }
    
    /**
     * 获取车牌号
     * 需要通过QuapDataAdapter从sys_vehicle_info表获取
     * 
     * @return 车牌号（可能为null，需要通过适配器获取）
     */
    public String getLicensePlate() {
        return this.licensePlate;
    }
} 