package com.qaup.collision.datacollector.filter;

import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import com.qaup.collision.common.model.AirportVehicle;
import com.qaup.system.service.ISysConfigService;
import com.qaup.system.service.ISysVehicleInfoService;

/**
 * 车辆位置过滤器
 * 根据系统配置决定是否过滤未在数据库中注册的车辆位置信息
 * 
 * @author AI Assistant
 * @version 1.0
 * @since 2025-01-31
 */
@Component
public class VehicleLocationFilter {
    
    private static final Logger log = LoggerFactory.getLogger(VehicleLocationFilter.class);
    
    private static final String CONFIG_KEY = "unmanaged.vehicle.filter.enabled";
    
    @Autowired
    private ISysConfigService configService;
    
    @Autowired
    private ISysVehicleInfoService vehicleInfoService;
    
    /**
     * 过滤机场车辆位置数据
     * @param vehicles 原始车辆列表
     * @return 过滤后的车辆列表
     */
    public List<AirportVehicle> filterVehicles(List<AirportVehicle> vehicles) {
        if (CollectionUtils.isEmpty(vehicles)) {
            return vehicles;
        }
        
        // 检查过滤功能是否启用
        if (!isFilterEnabled()) {
            log.debug("未管理车辆位置过滤功能已禁用，跳过过滤逻辑，直接返回所有车辆数据");
            return vehicles;
        }
        
        try {
            // 提取所有车牌号
            List<String> plateNumbers = vehicles.stream()
                .map(AirportVehicle::getPlateNumber)
                .filter(StringUtils::hasText)
                .distinct()
                .collect(Collectors.toList());
            
            if (plateNumbers.isEmpty()) {
                log.warn("所有车辆都没有车牌号信息，无法进行过滤");
                return Collections.emptyList();
            }
            
            // 批量查询存在的车牌号
            Set<String> existingPlates = getExistingVehiclePlates(plateNumbers);
            
            // 过滤车辆
            List<AirportVehicle> filteredVehicles = vehicles.stream()
                .filter(vehicle -> {
                    String plateNumber = vehicle.getPlateNumber();
                    if (!StringUtils.hasText(plateNumber)) {
                        return false; // 没有车牌号的车辆被过滤掉
                    }
                    return existingPlates.contains(plateNumber);
                })
                .collect(Collectors.toList());
            
            // 记录过滤统计信息
            int originalCount = vehicles.size();
            int filteredCount = filteredVehicles.size();
            int removedCount = originalCount - filteredCount;
            
            log.debug("车辆位置过滤完成 - 原始数量: {}, 过滤后数量: {}, 被过滤数量: {}", 
                     originalCount, filteredCount, removedCount);
            
            return filteredVehicles;
            
        } catch (Exception e) {
            log.error("车辆位置过滤过程中发生异常，返回原始数据", e);
            return vehicles; // 异常时返回原始数据，确保系统正常运行
        }
    }
    
    /**
     * 检查过滤功能是否启用
     * @return true表示启用过滤
     */
    private boolean isFilterEnabled() {
        try {
            String configValue = configService.selectConfigByKey(CONFIG_KEY);
            return "true".equalsIgnoreCase(configValue);
        } catch (Exception e) {
            log.warn("读取未管理车辆位置过滤配置失败，默认不过滤: {}", e.getMessage());
            return false; // 配置读取失败时默认不过滤
        }
    }
    
    /**
     * 批量检查车辆是否在数据库中存在
     * @param plateNumbers 车牌号列表
     * @return 存在的车牌号集合
     */
    private Set<String> getExistingVehiclePlates(List<String> plateNumbers) {
        try {
            // 使用批量查询方法，提高查询效率
            List<String> existingPlates = vehicleInfoService.selectExistingLicensePlates(plateNumbers);
            return existingPlates.stream().collect(Collectors.toSet());
                
        } catch (Exception e) {
            log.error("批量查询车辆信息失败，抛出异常以触发上层降级处理", e);
            throw new RuntimeException("车辆信息查询失败", e); // 抛出异常，让上层catch处理
        }
    }
}