package com.qaup.collision.websocket.message;

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

/**
 * WebSocket统一消息封装类
 * 与前端JSON格式完全兼容
 *
 * @param <T> 消息载荷类型
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UniversalMessage<T> {
    
    /**
     * 消息类型 (position_update, vehicle_command等)
     */
    @JsonProperty("type")
    private String type;
    
    /**
     * 微秒级时间戳
     */
    @JsonProperty("timestamp")
    private Long timestamp;
    
    /**
     * 消息唯一ID (可选)
     */
    @JsonProperty("messageId")
    private String messageId;
    
    /**
     * 消息载荷 (JSON格式的具体数据)
     * 根据消息类型，payload可能包含:
     * - 位置更新: object_id, object_type, position, heading, speed
     * - 车辆指令: vehicleId, vehicleType, commandType, reason等
     * - 红绿灯状态: intersection_id, position, ns_status, ew_status
     * - 碰撞预警: object1_id, object2_id, risk_level, distance等
     */
    @JsonProperty("payload")
    private T payload;
    
    /**
     * 为位置更新消息创建便捷方法
     */
    public static <T> UniversalMessage<T> positionUpdate(T payload) {
        return UniversalMessage.<T>builder()
                .type("position_update")
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
    
    /**
     * 为车辆指令消息创建便捷方法
     */
    public static <T> UniversalMessage<T> vehicleCommand(T payload) {
        return UniversalMessage.<T>builder()
                .type("vehicle_command")
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
    
    /**
     * 为红绿灯状态消息创建便捷方法
     */
    public static <T> UniversalMessage<T> trafficLightStatus(T payload) {
        return UniversalMessage.<T>builder()
                .type("intersection_traffic_light_status")
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
    
    /**
     * 为碰撞预警消息创建便捷方法
     */
    public static <T> UniversalMessage<T> collisionWarning(T payload) {
        return UniversalMessage.<T>builder()
                .type("collision_warning")
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
    
    // === 规则事件相关便捷方法 ===
    
    /**
     * 为规则违规事件消息创建便捷方法
     */
    public static <T> UniversalMessage<T> ruleViolation(T payload) {
        return UniversalMessage.<T>builder()
                .type(MessageTypeConstants.RULE_VIOLATION)
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
    
    /**
     * 为规则执行状态消息创建便捷方法
     */
    public static <T> UniversalMessage<T> ruleExecutionStatus(T payload) {
        return UniversalMessage.<T>builder()
                .type(MessageTypeConstants.RULE_EXECUTION_STATUS)
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
    
    /**
     * 为规则状态变更消息创建便捷方法
     */
    public static <T> UniversalMessage<T> ruleStateChange(T payload) {
        return UniversalMessage.<T>builder()
                .type(MessageTypeConstants.RULE_STATE_CHANGE)
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
    
    /**
     * 为规则告警消息创建便捷方法
     */
    public static <T> UniversalMessage<T> ruleAlert(T payload) {
        return UniversalMessage.<T>builder()
                .type(MessageTypeConstants.RULE_ALERT)
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
    
    /**
     * 为规则配置更新消息创建便捷方法
     */
    public static <T> UniversalMessage<T> ruleConfigUpdate(T payload) {
        return UniversalMessage.<T>builder()
                .type(MessageTypeConstants.RULE_CONFIG_UPDATE)
                .timestamp(java.time.Instant.now().toEpochMilli() * 1000) // 微秒级绝对时间戳
                .payload(payload)
                .build();
    }
} 