package com.qaup.collision.websocket.controller;

import com.qaup.collision.common.model.MovingObject.MovingObjectType;
import com.qaup.collision.common.model.spatial.VehicleLocation;
import com.qaup.collision.common.service.VehicleLocationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * WebSocket地理位置控制器
 * 提供实时车辆位置数据的WebSocket接口，基于PostGIS数据库
 */
@Slf4j
@Controller
@RequiredArgsConstructor
public class GeopositionController {

    private final VehicleLocationService vehicleLocationService;

    /**
     * 获取所有航空器的最新位置信息
     * 
     * 注意：航空器数据不再存储在数据库中，仅用于实时处理
     * 此接口将返回空数据，需要从实时数据流获取航空器位置
     * 
     * @return 空的位置数据映射（航空器数据不持久化）
     */
    @MessageMapping("/getGeoposition")
    @SendTo("/topic/geoSition")
    public Map<String, VehicleLocation> getGeosition() {
        log.debug("接收到地理坐标请求 - 航空器数据不再持久化存储");
        
        try {
            // 航空器数据不再存储在数据库中，返回空映射
            // 前端需要从实时数据流或其他方式获取航空器位置信息
            Map<String, VehicleLocation> resultMap = Map.of();
            
            log.debug("返回空的航空器位置信息（数据不持久化）");
            return resultMap;
            
        } catch (Exception e) {
            log.error("获取航空器地理位置数据时发生异常", e);
            return Map.of(); // 返回空映射而不是null
        }
    }

    /**
     * 获取所有类型车辆的最新位置信息
     * 
     * 注意：只返回无人车位置数据，因为其他车辆数据不再持久化
     * 
     * @return 无人车位置数据映射 (vehicleId -> VehicleLocation)
     */
    @MessageMapping("/getAllVehiclePositions")
    @SendTo("/topic/allVehiclePositions")
    public Map<String, VehicleLocation> getAllVehiclePositions() {
        log.debug("接收到全部车辆位置请求 - 仅返回无人车数据");
        
        try {
            // 只获取无人车数据，因为其他车辆数据不再持久化存储
            List<VehicleLocation> unmannedVehicles = vehicleLocationService
                    .getActiveVehiclesByType(MovingObjectType.UNMANNED_VEHICLE, 5);
            
            // 转换为Map格式，使用vehicleId作为索引key
            Map<String, VehicleLocation> resultMap = unmannedVehicles.stream()
                    .collect(Collectors.toMap(
                            location -> String.valueOf(location.getVehicleId()), // 索引性质使用vehicleId
                            location -> location, // VehicleLocation包含完整信息（vehicleId + licensePlate）
                            (existing, replacement) -> replacement
                    ));
            
            log.debug("返回 {} 个无人车位置信息（航空器和特种车辆数据不持久化）", resultMap.size());
            return resultMap;
            
        } catch (Exception e) {
            log.error("获取车辆地理位置数据时发生异常", e);
            return Map.of();
        }
    }

    /**
     * 根据车辆类型获取位置信息
     * 
     * 注意：只有UNMANNED_VEHICLE类型会返回数据，其他类型返回空数据
     * 
     * @param vehicleType 车辆类型
     * @return 指定类型车辆位置数据（仅无人车有持久化数据）
     */
    @MessageMapping("/getVehiclesByType")
    @SendTo("/topic/vehiclesByType")
    public Map<String, VehicleLocation> getVehiclesByType(MovingObjectType vehicleType) {
        log.debug("接收到按类型查询车辆位置请求，类型: {}", vehicleType);
        
        try {
            List<VehicleLocation> vehicles;
            
            if (MovingObjectType.UNMANNED_VEHICLE.equals(vehicleType)) {
                // 无人车数据从数据库获取
                vehicles = vehicleLocationService.getActiveVehiclesByType(vehicleType, 5);
                log.debug("查询无人车数据: {} 条记录", vehicles.size());
            } else {
                // 航空器和特种车辆数据不持久化，返回空列表
                vehicles = List.of();
                log.debug("类型 {} 的数据不持久化存储，返回空数据", vehicleType);
            }
            
            Map<String, VehicleLocation> resultMap = vehicles.stream()
                    .collect(Collectors.toMap(
                            location -> String.valueOf(location.getVehicleId()), // 索引性质使用vehicleId
                            location -> location, // VehicleLocation包含完整信息（vehicleId + licensePlate）
                            (existing, replacement) -> replacement
                    ));
            
            log.debug("返回 {} 个 {} 类型车辆位置信息", resultMap.size(), vehicleType);
            return resultMap;
            
        } catch (Exception e) {
            log.error("根据类型获取车辆地理位置数据时发生异常，类型: {}", vehicleType, e);
            return Map.of();
        }
    }
}
