package webhook

import (
	"encoding/json"
	"time"
)

// --- 通用结构体 ---

// DeviceInfo 包含了所有事件中通用的设备信息。
// 基于 aiserver.proto v4 (integration)
type DeviceInfo struct {
	TenantID           string            `json:"tenant_id"`                      // 租户ID
	TenantName         string            `json:"tenant_name"`                    // 租户名称
	ApplicationID      string            `json:"application_id"`                 // 应用ID
	ApplicationName    string            `json:"application_name"`               // 应用名称
	DeviceProfileID    string            `json:"device_profile_id"`              // 设备配置文件ID
	DeviceProfileName  string            `json:"device_profile_name"`            // 设备配置文件名称
	DeviceName         string            `json:"device_name"`                    // 设备名称
	DevEui             string            `json:"dev_eui"`                        // 设备EUI (十六进制编码)
	DeviceClassEnabled string            `json:"device_class_enabled,omitempty"` // 设备启用的LoRaWAN类别 (A, B, 或 C)
	Tags               map[string]string `json:"tags"`                           // 用户定义的标签
}

// Location 包含了地理位置信息。
type Location struct {
	Latitude  float32 `json:"latitude"`  // 纬度
	Longitude float32 `json:"longitude"` // 经度
	Altitude  float32 `json:"altitude"`  // 海拔
}

// --- 可复用的子结构体 ---

// UplinkRelayRxInfo 包含了上行中继接收信息。
type UplinkRelayRxInfo struct {
	DevEui     string `json:"dev_eui"`     // 中继设备的DevEUI
	Frequency  uint32 `json:"frequency"`   // 接收频率
	Dr         uint32 `json:"dr"`          // 数据速率
	Snr        int32  `json:"snr"`         // 信噪比
	Rssi       int32  `json:"rssi"`        // 接收信号强度指示
	WorChannel uint32 `json:"wor_channel"` // Work-on-Relay 通道
}

// KeyEnvelope 包装了一个加密的密钥。
// 基于 common.proto
type KeyEnvelope struct {
	KEKLabel string `json:"kek_label,omitempty"` // 密钥加密密钥 (KEK) 标签
	AESKey   string `json:"aes_key,omitempty"`   // Base64 编码的加密密钥
}

// JoinServerContext 包含了 Join-Server 上下文。
// 基于 common.proto
type JoinServerContext struct {
	SessionKeyID string       `json:"session_key_id"`      // 会话密钥ID
	AppSKey      *KeyEnvelope `json:"app_s_key,omitempty"` // 应用会话密钥
}

// UplinkRxInfo 包含了上行接收信息。
type UplinkRxInfo struct {
	GatewayID string            `json:"gateway_id"` // 接收到上行数据的网关ID
	UplinkID  uint32            `json:"uplink_id"`  // 上行ID
	Time      time.Time         `json:"time"`       // 接收时间
	Rssi      int               `json:"rssi"`       // 接收信号强度指示
	Snr       float32           `json:"snr"`        // 信噪比
	Channel   int               `json:"channel"`    // 接收通道
	Location  *Location         `json:"location"`   // 网关位置
	Context   string            `json:"context"`    // 上下文信息
	Metadata  map[string]string `json:"metadata"`   // 元数据
}

// LoraModulationInfo 包含了 LoRa 调制的具体参数。
type LoraModulationInfo struct {
	Bandwidth       int    `json:"bandwidth"`                     // 带宽
	SpreadingFactor int    `json:"spreading_factor"`              // 扩频因子
	CodeRate        string `json:"code_rate"`                     // 编码率
	Polarization    bool   `json:"polarization_invert,omitempty"` // 极化反转
}

// Modulation 包含了具体的调制信息。
type Modulation struct {
	Lora LoraModulationInfo `json:"lora"` // LoRa 调制信息
}

// UplinkTxInfo 包含了上行发送信息。
type UplinkTxInfo struct {
	Frequency  int        `json:"frequency"`  // 发送频率
	Modulation Modulation `json:"modulation"` // 调制信息
}

// DownlinkTxInfo 包含了下行发送信息。
type DownlinkTxInfo struct {
	Frequency  int        `json:"frequency"`  // 发送频率
	Power      int        `json:"power"`      // 发送功率
	Modulation Modulation `json:"modulation"` // 调制信息
}

// ResolvedLocation 包含了地理位置解析结果。
type ResolvedLocation struct {
	Latitude  float32 `json:"latitude"`  // 纬度
	Longitude float32 `json:"longitude"` // 经度
	Altitude  float32 `json:"altitude"`  // 海拔
	Source    string  `json:"source"`    // 位置来源
	Accuracy  int     `json:"accuracy"`  // 精度
}

// --- 事件专属结构体 ---

// UpEvent 对应 ChirpStack 的 "up" 事件。
type UpEvent struct {
	DeduplicationID   string             `json:"deduplication_id"`              // 去重ID
	Time              time.Time          `json:"time"`                          // 事件时间
	DeviceInfo        DeviceInfo         `json:"device_info"`                   // 设备信息
	DevAddr           string             `json:"dev_addr"`                      // 设备地址
	ADR               bool               `json:"adr"`                           // 自适应数据速率 (ADR) 是否启用
	DR                int                `json:"dr"`                            // 数据速率
	FCnt              uint32             `json:"f_cnt"`                         // 帧计数器
	FPort             uint8              `json:"f_port"`                        // 端口
	Confirmed         bool               `json:"confirmed"`                     // 是否是确认帧
	Data              string             `json:"data"`                          // Base64 编码的原始负载数据
	Object            json.RawMessage    `json:"object"`                        // 解码后的JSON对象负载
	RxInfo            []UplinkRxInfo     `json:"rx_info"`                       // 接收信息列表
	TxInfo            UplinkTxInfo       `json:"tx_info"`                       // 发送信息
	RelayRxInfo       *UplinkRelayRxInfo `json:"relay_rx_info,omitempty"`       // 中继接收信息
	JoinServerContext *JoinServerContext `json:"join_server_context,omitempty"` // Join-Server 上下文
	RegionConfigID    string             `json:"region_config_id,omitempty"`    // 区域配置ID
}

// JoinEvent 对应 ChirpStack 的 "join" 事件。
type JoinEvent struct {
	DeduplicationID   string             `json:"deduplication_id"`              // 去重ID
	Time              time.Time          `json:"time"`                          // 事件时间
	DeviceInfo        DeviceInfo         `json:"device_info"`                   // 设备信息
	DevAddr           string             `json:"dev_addr"`                      // 设备地址
	RelayRxInfo       *UplinkRelayRxInfo `json:"relay_rx_info,omitempty"`       // 中继接收信息
	JoinServerContext *JoinServerContext `json:"join_server_context,omitempty"` // Join-Server 上下文
	RegionConfigID    string             `json:"region_config_id,omitempty"`    // 区域配置ID
}

// AckEvent 对应 ChirpStack 的 "ack" 事件。
type AckEvent struct {
	DeduplicationID string     `json:"deduplication_id"` // 去重ID
	Time            time.Time  `json:"time"`             // 事件时间
	DeviceInfo      DeviceInfo `json:"device_info"`      // 设备信息
	Acknowledged    bool       `json:"acknowledged"`     // 是否已确认
	FCntDown        uint32     `json:"f_cnt_down"`       // 下行帧计数器
	QueueItemID     string     `json:"queue_item_id"`    // 队列项ID
}

// TxAckEvent 对应 ChirpStack 的 "txack" 事件。
type TxAckEvent struct {
	DownlinkID  uint32         `json:"downlink_id"`   // 下行ID
	Time        time.Time      `json:"time"`          // 事件时间
	DeviceInfo  DeviceInfo     `json:"device_info"`   // 设备信息
	FCntDown    uint32         `json:"f_cnt_down"`    // 下行帧计数器
	GatewayID   string         `json:"gateway_id"`    // 网关ID
	QueueItemID string         `json:"queue_item_id"` // 队列项ID
	TxInfo      DownlinkTxInfo `json:"tx_info"`       // 下行发送信息
}

// StatusEvent 对应 ChirpStack 的 "status" 事件。
type StatusEvent struct {
	DeduplicationID         string     `json:"deduplication_id"`          // 去重ID
	Time                    time.Time  `json:"time"`                      // 事件时间
	DeviceInfo              DeviceInfo `json:"device_info"`               // 设备信息
	Margin                  int        `json:"margin"`                    // 链路预算余量 (dB)
	ExternalPower           bool       `json:"external_power_source"`     // 设备是否连接外部电源
	BatteryLevel            float32    `json:"battery_level"`             // 电池剩余电量
	BatteryLevelUnavailable bool       `json:"battery_level_unavailable"` // 电池电量是否不可用
}

// LogEvent 对应 ChirpStack 的 "log" 事件。
type LogEvent struct {
	DeduplicationID string            `json:"deduplication_id"` // 去重ID
	Time            time.Time         `json:"time"`             // 事件时间
	DeviceInfo      DeviceInfo        `json:"device_info"`      // 设备信息
	Level           string            `json:"level"`            // 日志级别 (e.g., INFO, WARNING, ERROR)
	Code            string            `json:"code"`             // 日志代码
	Description     string            `json:"description"`      // 日志描述
	Context         map[string]string `json:"context"`          // 上下文信息
}

// LocationEvent 对应 ChirpStack 的 "location" 事件。
type LocationEvent struct {
	DeduplicationID string           `json:"deduplication_id"` // 去重ID
	Time            time.Time        `json:"time"`             // 事件时间
	DeviceInfo      DeviceInfo       `json:"device_info"`      // 设备信息
	Location        ResolvedLocation `json:"location"`         // 解析后的位置信息
}

// IntegrationEvent 对应 ChirpStack 的 "integration" 事件。
type IntegrationEvent struct {
	DeduplicationID string          `json:"deduplication_id"`     // 去重ID
	Time            time.Time       `json:"time"`                 // 事件时间
	DeviceInfo      DeviceInfo      `json:"device_info"`          // 设备信息
	IntegrationName string          `json:"integration_name"`     // 集成名称
	EventType       string          `json:"event_type,omitempty"` // 事件类型
	Object          json.RawMessage `json:"object"`               // 集成事件的原始JSON负载
}
