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

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

import java.time.LocalDateTime;
import java.util.List;

import com.qaup.collision.rule.model.enums.RuleAlertLevel;

/**
 * 电子围栏准入检测结果
 * 
 * @author qaup-collision  
 * @date 2025-01-15
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeofenceAccessCheckResult {
    
    /**
     * 检测结果类型
     */
    private AccessResultType resultType;
    
    /**
     * 是否允许进入
     */
    private Boolean allowed;
    
    /**
     * 检测的区域编码
     */
    private String areaCode;
    
    /**
     * 区域名称
     */
    private String areaName;
    
    /**
     * 无人车ID
     */
    private String vehicleId;
    
    /**
     * 触发的规则列表
     */
    private List<TriggeredRule> triggeredRules;
    
    /**
     * 主要告警级别
     */
    private RuleAlertLevel alertLevel;
    
    /**
     * 检测消息
     */
    private String message;
    
    /**
     * 详细原因
     */
    private String reason;
    
    /**
     * 检测时间
     */
    private LocalDateTime checkTime;
    
    /**
     * 建议操作
     */
    private List<String> recommendedActions;
    
    /**
     * 检测结果类型枚举
     */
    public enum AccessResultType {
        ALLOWED,        // 允许进入
        DENIED,         // 拒绝进入  
        WARNING,        // 警告但允许
        CONDITIONAL,    // 有条件允许
        SKIPPED         // 跳过检测（非无人车）
    }
    
    /**
     * 触发的规则信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TriggeredRule {
        
        /**
         * 规则ID
         */
        private String ruleId;
        
        /**
         * 规则名称
         */
        private String ruleName;
        
        /**
         * 规则分类
         */
        private String ruleCategory;
        
        /**
         * 违规类型
         */
        private String violationType;
        
        /**
         * 告警级别
         */
        private RuleAlertLevel alertLevel;
        
        /**
         * 规则消息
         */
        private String message;
        
        /**
         * 规则参数
         */
        private String parameters;
    }
    
    // 静态工厂方法
    
    /**
     * 创建允许进入的结果
     */
    public static GeofenceAccessCheckResult allowed(String areaCode, String vehicleId) {
        return GeofenceAccessCheckResult.builder()
                .resultType(AccessResultType.ALLOWED)
                .allowed(true)
                .areaCode(areaCode)
                .vehicleId(vehicleId)
                .alertLevel(RuleAlertLevel.INFO)
                .message("允许进入")
                .checkTime(LocalDateTime.now())
                .build();
    }
    
    /**
     * 创建拒绝进入的结果
     */
    public static GeofenceAccessCheckResult denied(String areaCode, String vehicleId, String reason) {
        return GeofenceAccessCheckResult.builder()
                .resultType(AccessResultType.DENIED)
                .allowed(false)
                .areaCode(areaCode)
                .vehicleId(vehicleId)
                .alertLevel(RuleAlertLevel.CRITICAL)
                .message("拒绝进入")
                .reason(reason)
                .checkTime(LocalDateTime.now())
                .build();
    }
    
    /**
     * 创建警告的结果
     */
    public static GeofenceAccessCheckResult warning(String areaCode, String vehicleId, String message) {
        return GeofenceAccessCheckResult.builder()
                .resultType(AccessResultType.WARNING)
                .allowed(true)
                .areaCode(areaCode)
                .vehicleId(vehicleId)
                .alertLevel(RuleAlertLevel.WARNING)
                .message(message)
                .checkTime(LocalDateTime.now())
                .build();
    }
    
    /**
     * 创建跳过检测的结果（非无人车）
     */
    public static GeofenceAccessCheckResult skipped(String vehicleId) {
        return GeofenceAccessCheckResult.builder()
                .resultType(AccessResultType.SKIPPED)
                .allowed(null) // 不适用
                .vehicleId(vehicleId)
                .message("非无人车，跳过电子围栏检测")
                .checkTime(LocalDateTime.now())
                .build();
    }
}