package com.qaup.collision.geofence.model.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

import java.util.List;

/**
 * 无人车电子围栏规则配置参数
 * 用于JSON格式存储在SpatialRule.parameters字段中
 * 
 * @author qaup-collision
 * @date 2025-01-15
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UnmannedVehicleGeofenceRuleConfig {
    
    /**
     * 准入控制配置
     */
    @JsonProperty("accessControl")
    private AccessControlConfig accessControl;
    
    /**
     * 物理限制配置
     */
    @JsonProperty("physicalLimits")
    private PhysicalLimitsConfig physicalLimits;
    
    /**
     * 时间限制配置
     */
    @JsonProperty("timeRestrictions")
    private TimeRestrictionsConfig timeRestrictions;
    
    /**
     * 安全要求配置
     */
    @JsonProperty("safetyRequirements")
    private SafetyRequirementsConfig safetyRequirements;
    
    /**
     * 准入控制配置
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class AccessControlConfig {
        
        /**
         * 是否需要权限验证
         */
        @JsonProperty("requiresPermission")
        @Builder.Default
        private Boolean requiresPermission = false;
        
        /**
         * 允许的操作模式
         */
        @JsonProperty("allowedOperationModes")
        private List<String> allowedOperationModes;
        
        /**
         * 是否允许自动驾驶模式
         */
        @JsonProperty("allowAutonomousMode")
        @Builder.Default
        private Boolean allowAutonomousMode = true;
        
        /**
         * 是否允许远程控制模式
         */
        @JsonProperty("allowRemoteControlMode")
        @Builder.Default
        private Boolean allowRemoteControlMode = true;
    }
    
    /**
     * 物理限制配置
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class PhysicalLimitsConfig {
        
        /**
         * 最大速度限制 (km/h)
         */
        @JsonProperty("maxSpeed")
        private Double maxSpeed;
        
        /**
         * 最小速度限制 (km/h) 
         */
        @JsonProperty("minSpeed")
        private Double minSpeed;
        
        /**
         * 最大高度限制 (米)
         */
        @JsonProperty("maxHeight")
        private Double maxHeight;
        
        /**
         * 最大载重限制 (吨)
         */
        @JsonProperty("maxWeight")
        private Double maxWeight;
        
        /**
         * 最大尺寸限制 (长x宽x高，米)
         */
        @JsonProperty("maxDimensions")
        private String maxDimensions;
    }
    
    /**
     * 时间限制配置
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TimeRestrictionsConfig {
        
        /**
         * 活跃时间段 (例如: "06:00-22:00")
         */
        @JsonProperty("activeHours")
        private String activeHours;
        
        /**
         * 活跃日期 (例如: ["MONDAY", "TUESDAY", ...])
         */
        @JsonProperty("activeDays")
        private List<String> activeDays;
        
        /**
         * 禁止时间段 (例如: ["12:00-13:00", "18:00-19:00"])
         */
        @JsonProperty("blackoutPeriods")
        private List<String> blackoutPeriods;
        
        /**
         * 最大停留时间 (分钟)
         */
        @JsonProperty("maxStayDurationMinutes")
        private Integer maxStayDurationMinutes;
    }
    
    /**
     * 安全要求配置
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class SafetyRequirementsConfig {
        
        /**
         * 最低电池电量要求 (百分比)
         */
        @JsonProperty("minBatteryLevel")
        private Integer minBatteryLevel;
        
        /**
         * 是否需要操作员在场
         */
        @JsonProperty("requiresOperatorPresence")
        @Builder.Default
        private Boolean requiresOperatorPresence = false;
        
        /**
         * 最大同时进入车辆数
         */
        @JsonProperty("maxConcurrentVehicles")
        private Integer maxConcurrentVehicles;
        
        /**
         * 是否需要预约
         */
        @JsonProperty("requiresReservation")
        @Builder.Default
        private Boolean requiresReservation = false;
        
        /**
         * 是否需要护航车辆
         */
        @JsonProperty("requiresEscortVehicle")
        @Builder.Default
        private Boolean requiresEscortVehicle = false;
        
        /**
         * 必需的安全装备
         */
        @JsonProperty("requiredSafetyEquipment")
        private List<String> requiredSafetyEquipment;
    }
}