package com.qaup.collision.common.service;

import com.qaup.collision.common.model.MovingObject.MovingObjectType;
import com.qaup.collision.common.model.enums.VehicleSubType;
import com.qaup.collision.common.model.spatial.AirportArea;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 车辆权限管理服务
 * 处理特勤车辆的特殊权限和业务规则
 */
@Slf4j
@Service
public class VehiclePermissionService {

    /**
     * 检查车辆是否可以进入指定区域
     */
    public boolean canEnterArea(Long vehicleId, MovingObjectType vehicleType, AirportArea area) {
        try {
            // 航空器总是可以进入所有区域
            if (vehicleType == MovingObjectType.AIRCRAFT) {
                return true;
            }
            
            // 特勤车辆具有特殊权限，除跑道外都可以进入
            if (vehicleType == MovingObjectType.SPECIAL_VEHICLE) {
                return !"RUNWAY".equals(area.getType());
            }
            
            // 无人车根据配置检查
            if (vehicleType == MovingObjectType.UNMANNED_VEHICLE) {
                return checkUnmannedVehicleAccess(vehicleId, area);
            }
            
            // 普通车辆需要进一步检查子类型
            if (vehicleType == MovingObjectType.NORMAL_VEHICLE) {
                return checkNormalVehicleAccess(vehicleId, area);
            }
            
            return false;
        } catch (Exception e) {
            log.error("检查车辆区域权限失败: vehicleId={}, vehicleType={}, areaName={}", 
                     vehicleId, vehicleType, area.getName(), e);
            return false;
        }
    }
    
    /**
     * 检查普通车辆的区域访问权限
     */
    private boolean checkNormalVehicleAccess(Long vehicleId, AirportArea area) {
        //VehicleSubType subType = VehicleSubType.inferFromVehicleId(vehicleId);
        VehicleSubType subType = VehicleSubType.AMBULANCE;
        
        // 注意：车辆类型限制现在在geofences表中配置，这里提供基本的默认规则
        // 实际应该查询相关的SpatialRule来获取精确的权限控制
        
        // 特勤车辆检查
        if (subType != null && subType.isSpecialVehicle()) {
            // 特勤车辆有特殊权限，可以进入更多区域
            return checkSpecialVehicleAccess(subType, area);
        }
        
        // 一般普通车辆按区域类型和默认规则检查
        return checkRegularVehicleAccess(subType, area);
    }
    
    /**
     * 检查特勤车辆的特殊权限
     */
    private boolean checkSpecialVehicleAccess(VehicleSubType subType, AirportArea area) {
        // 特勤车辆可以进入滑行道（紧急情况）
        if ("TAXIWAY".equals(area.getType()) && subType.hasSpecialRights()) {
            log.info("特勤车辆 {} 获得滑行道特殊通行权限", subType.getDisplayName());
            return true;
        }
        
        // 特勤车辆可以进入大部分区域（除了跑道等高危区域）
        if ("RUNWAY".equals(area.getType())) {
            return false; // 跑道禁止地面车辆
        }
        
        return true; // 特勤车辆默认允许进入其他区域
    }
    
    /**
     * 检查一般车辆权限
     */
    private boolean checkRegularVehicleAccess(VehicleSubType subType, AirportArea area) {
        if (subType == null) return false;
        
        // 基于区域类型的默认规则
        String areaType = area.getType();
        
        // 跑道禁止所有地面车辆
        if ("RUNWAY".equals(areaType)) {
            return false;
        }
        
        // 滑行道只允许特定车辆类型
        if ("TAXIWAY".equals(areaType)) {
            return subType == VehicleSubType.TUG || 
                   subType == VehicleSubType.FOLLOW_ME || 
                   subType == VehicleSubType.FUEL_TRUCK;
        }
        
        // 其他区域根据车辆类型判断
        return isVehicleAllowedInGeneralArea(subType, areaType);
    }
    
    /**
     * 检查车辆是否允许在一般区域活动
     */
    private boolean isVehicleAllowedInGeneralArea(VehicleSubType subType, String areaType) {
        // 货运区域允许货运相关车辆
        if ("CARGO_AREA".equals(areaType)) {
            return subType == VehicleSubType.TUG || 
                   subType == VehicleSubType.BAGGAGE_CART;
        }
        
        // 维修区域允许维修车辆
        if ("MAINTENANCE_AREA".equals(areaType)) {
            return subType == VehicleSubType.CLEANING_VEHICLE || 
                   subType == VehicleSubType.TUG;
        }
        
        // 停机坪允许大部分服务车辆
        if ("APRON".equals(areaType)) {
            return subType == VehicleSubType.FUEL_TRUCK || 
                   subType == VehicleSubType.CATERING_TRUCK || 
                   subType == VehicleSubType.BAGGAGE_CART || 
                   subType == VehicleSubType.CLEANING_VEHICLE || 
                   subType == VehicleSubType.TUG;
        }
        
        // 其他区域默认允许一般服务车辆
        return true;
    }
    
    /**
     * 检查无人车访问权限
     */
    private boolean checkUnmannedVehicleAccess(Long vehicleId, AirportArea area) {
        // 注意：车辆类型限制现在在geofences表中配置
        // 这里提供基本的默认规则，实际应该查询相关的SpatialRule
        
        String areaType = area.getType();
        
        // 无人车不允许进入跑道和滑行道
        if ("RUNWAY".equals(areaType) || "TAXIWAY".equals(areaType)) {
            return false;
        }
        
        // 无人车可以在指定的服务区域活动
        return "SERVICE_AREA".equals(areaType) || 
               "CARGO_AREA".equals(areaType) || 
               "MAINTENANCE_AREA".equals(areaType);
    }
    
    /**
     * 检查车辆是否需要避让
     */
    public boolean shouldYieldTo(Long thisVehicleId, MovingObjectType thisVehicleType, 
                                Long otherVehicleId, MovingObjectType otherVehicleType) {
        
        // 航空器优先级最高
        if (otherVehicleType == MovingObjectType.AIRCRAFT) {
            return true;
        }
        
        // 特勤车辆优先级很高
        if (otherVehicleType == MovingObjectType.SPECIAL_VEHICLE) {
            log.info("车辆 {} 需要为特勤车辆避让", thisVehicleId);
            return true;
        }
        
        // 如果对方是普通车辆，检查是否为特勤车辆
        if (otherVehicleType == MovingObjectType.NORMAL_VEHICLE) {
            VehicleSubType otherSubType = VehicleSubType.AMBULANCE;
            if (otherSubType != null && otherSubType.hasSpecialRights()) {
                log.info("车辆 {} 需要为特勤车辆 {} 避让", thisVehicleId, otherSubType.getDisplayName());
                return true;
            }
        }
        
        return false;
    }
    
    /**
     * 检查车辆是否需要遵守红绿灯
     */
    public boolean mustObeyTrafficLight(Long vehicleId, MovingObjectType vehicleType) {
        // 航空器不受红绿灯控制
        if (vehicleType == MovingObjectType.AIRCRAFT) {
            return false;
        }
        
        // 特勤车辆不受红绿灯限制（紧急通行权）
        if (vehicleType == MovingObjectType.SPECIAL_VEHICLE) {
            log.debug("特勤车辆无需遵守红绿灯");
            return false;
        }
        
        // 普通车辆中的特勤车辆不受红绿灯限制
        if (vehicleType == MovingObjectType.NORMAL_VEHICLE) {
            VehicleSubType subType = VehicleSubType.AMBULANCE;
            if (subType != null && subType.hasSpecialRights()) {
                log.debug("特勤车辆 {} 无需遵守红绿灯", subType.getDisplayName());
                return false;
            }
        }
        
        // 其他车辆（包括无人车）都需要遵守红绿灯
        return true;
    }
    
    /**
     * 获取车辆的权限级别描述
     */
    public String getPermissionLevel(Long vehicleId, MovingObjectType vehicleType) {
        if (vehicleType == MovingObjectType.AIRCRAFT) {
            return "最高权限（航空器）";
        }
        
        if (vehicleType == MovingObjectType.SPECIAL_VEHICLE) {
            return "特殊权限（特勤车辆）";
        }
        
        if (vehicleType == MovingObjectType.NORMAL_VEHICLE) {
            VehicleSubType subType = VehicleSubType.AMBULANCE;
            if (subType != null && subType.hasSpecialRights()) {
                return "特殊权限（" + subType.getDisplayName() + "）";
            }
            return "一般权限（普通车辆）";
        }
        
        if (vehicleType == MovingObjectType.UNMANNED_VEHICLE) {
            return "受控权限（无人车）";
        }
        
        return "未知权限";
    }
} 