package com.qaup.collision.websocket.event;

import com.qaup.collision.common.model.spatial.VehicleLocation;
import com.qaup.collision.websocket.message.MessageTypeConstants;
import com.qaup.collision.websocket.message.PositionUpdatePayload;

import lombok.Getter;
import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.util.UUID;

/**
 * 位置更新事件
 * 当车辆或航空器位置数据处理完成后发布此事件
 */
@Getter
public class PositionUpdateEvent implements WebSocketEvent {
    
    private final String eventId;
    private final long timestamp;
    private final Object payload; // 支持VehicleLocation和PositionUpdatePayload两种类型
    
    // 支持VehicleLocation构造函数（用于无人车数据）
    public PositionUpdateEvent(VehicleLocation vehicleLocation) {
        this.eventId = UUID.randomUUID().toString();
        this.timestamp = java.time.Instant.now().toEpochMilli() * 1000; // 微秒级绝对时间戳
        this.payload = vehicleLocation;
    }
    
    // 支持PositionUpdatePayload构造函数（用于航空器和机场车辆数据）
    public PositionUpdateEvent(PositionUpdatePayload positionPayload) {
        this.eventId = UUID.randomUUID().toString();
        this.timestamp = java.time.Instant.now().toEpochMilli() * 1000; // 微秒级绝对时间戳
        this.payload = positionPayload;
    }
    
    @Override
    public String getEventType() {
        return MessageTypeConstants.POSITION_UPDATE;
    }
    
    @Override
    public Object getPayload() {
        return payload;
    }
    
    /**
     * 获取车辆ID（索引性质）
     * 
     * 按照API设计原则：
     * - 对于无人车数据：返回数据库主键vehicleId
     * - 对于航空器/机场车辆：返回null（因为它们没有数据库记录）
     * 
     * @return 车辆ID（Long类型），不适用时返回null
     */
    public Long getVehicleId() {
        if (payload instanceof VehicleLocation) {
            return ((VehicleLocation) payload).getVehicleId();
        }
        // 航空器和机场车辆没有数据库记录，返回null
        return null;
    }
    
    /**
     * 获取业务标识符（详细信息）
     * 
     * 按照API设计原则：
     * - 对于无人车数据：返回车牌号
     * - 对于航空器/机场车辆：返回objectId（可能是车牌号、航班号等）
     * 
     * @return 业务标识符（String类型）
     */
    public String getLicensePlate() {
        if (payload instanceof VehicleLocation) {
            return ((VehicleLocation) payload).getLicensePlate();
        } else if (payload instanceof PositionUpdatePayload) {
            return ((PositionUpdatePayload) payload).getObjectId();
        }
        return null;
    }
    
    /**
     * 获取完整的标识符信息
     * 
     * @return 包含vehicleId和businessId的完整信息
     */
    public VehicleIdentifier getVehicleIdentifier() {
        if (payload instanceof VehicleLocation) {
            VehicleLocation location = (VehicleLocation) payload;
            return VehicleIdentifier.builder()
                    .vehicleId(location.getVehicleId())
                    .businessId(location.getLicensePlate())
                    .vehicleType(location.getVehicleType().name())
                    .build();
        } else if (payload instanceof PositionUpdatePayload) {
            PositionUpdatePayload positionPayload = (PositionUpdatePayload) payload;
            return VehicleIdentifier.builder()
                    .vehicleId(null) // 航空器没有数据库记录
                    .businessId(positionPayload.getObjectId())
                    .vehicleType(positionPayload.getObjectType())
                    .build();
        }
        return null;
    }
    
    /**
     * 获取车辆类型
     */
    public String getVehicleType() {
        if (payload instanceof VehicleLocation) {
            return ((VehicleLocation) payload).getVehicleType().name();
        } else if (payload instanceof PositionUpdatePayload) {
            return ((PositionUpdatePayload) payload).getObjectType();
        }
        return null;
    }
    
    /**
     * 车辆标识符信息类
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class VehicleIdentifier {
        private Long vehicleId;      // 数据库主键（索引性质）
        private String businessId;   // 业务标识符（车牌号、航班号等）
        private String vehicleType;  // 车辆类型
    }
} 