/**
 * package models
 * 作用：定义项目中所有的数据结构，包括 HTTP 请求/响应载荷、数据库模型、Redis 消息格式以及常量定义。
 */
package models

import "time"

/**
 * SendMessagePayload
 * 结构体：客户端发送消息的请求载荷。
 * 用途：用于解析 WebSocket 或 HTTP POST 请求体中的 JSON 数据。
 */
// 统一消息结构（发送方使用）
type SendMessagePayload struct {
	RequestType         string `json:"request_type"`          // 消息类型
	TargetClientID      string `json:"target_client_id"`      // 目标客户端ID
	SenderUserID        string `json:"sender_user_id"`        // 发送者用户ID
	ReceiverUserID      string `json:"receiver_user_id"`      // 接收者用户ID
	MessageType         int    `json:"message_type"`          // 消息类型（0-13）
	MessageContent      string `json:"message_content"`       // 消息内容
	RoomId              string `json:"room_id"`               // 房间ID
	Duration            int    `json:"duration"`              // 时长（音频、视频、音视频通话）
	Token               string `json:"token,omitempty"`       // 认证Token
	UserType            string `json:"user_type,omitempty"`   // 用户类型: user/doctor
	CleanOldConnections bool   `json:"clean_old_connections"` // 是否清理旧连接（bind时使用）
	// 通话专用字段
	CallID     string `json:"call_id,omitempty"`     // 通话唯一ID
	CallStatus string `json:"call_status,omitempty"` // 通话状态:invite/accepted/rejected/ended/candidate
}

/**
 * SendToUserPayload
 * 结构体：仅通过用户ID发送消息的简化载荷。
 */
// 通过用户ID发送消息的结构
type SendToUserPayload struct {
	RoomId         string `json:"room_id"`          // 发送者用户ID
	Duration       int    `json:"duration"`         // 时长（音频、视频、音视频通话）
	SenderUserID   string `json:"sender_user_id"`   // 发送者用户ID
	ReceiverUserID string `json:"receiver_user_id"` // 接收者用户ID
	MessageType    int    `json:"message_type"`     // 消息类型（0-13）
	MessageContent string `json:"message_content"`  // 消息内容
	// 通话专用字段
	CallID     string `json:"call_id,omitempty"`     // 通话唯一ID
	CallStatus string `json:"call_status,omitempty"` // 通话状态:invite/accepted/rejected/ended/candidate/offer/answer
}

/**
 * XkChatMessage
 * 结构体：数据库模型，对应 xk_chat_messages 表（假设）。
 * 用途：持久化存储聊天记录。
 */
// 聊天消息记录模型
type XkChatMessage struct {
	ID             uint      `gorm:"primaryKey" json:"id"`
	RoomId         string    `gorm:"type:varchar(100);index" json:"room_id"`          // 房间ID
	SenderUserID   string    `gorm:"type:varchar(100);index" json:"sender_user_id"`   // 发送者用户ID
	ReceiverUserID string    `gorm:"type:varchar(100);index" json:"receiver_user_id"` // 接收者用户ID
	MessageType    int       `gorm:"type:int" json:"message_type"`                    // 消息类型（0-9）
	MessageContent string    `gorm:"type:text" json:"message_content"`                // 消息内容
	Duration       int       `json:"duration"`                                        // 时长（音频、视频、音视频通话）
	CallID         string    `gorm:"type:varchar(100);index" json:"call_id"`          // 通话唯一ID
	CallStatus     string    `gorm:"type:varchar(50)" json:"call_status"`             // 通话状态
	CreatedAt      time.Time `gorm:"autoCreateTime" json:"created_at"`                // 创建时间
}

/**
 * ClientReceivedMessage
 * 结构体：客户端最终接收到的消息格式。
 * 用途：服务端推送到客户端的 JSON 结构。
 */
// 客户端接收消息结构（最终格式）
type ClientReceivedMessage struct {
	ID             int    `json:"id"`               // 房间号
	RoomID         string `json:"room_id"`          // 房间号
	SenderID       string `json:"sender_id"`        // 发送者连接ID
	ReceiverID     string `json:"receiver_id"`      // 接收者连接ID
	SenderUserID   string `json:"sender_user_id"`   // 发送者用户ID
	ReceiverUserID string `json:"receiver_user_id"` // 接收者用户ID
	MessageType    int    `json:"message_type"`     // 消息类型（0-13）
	MessageContent string `json:"message_content"`  // 消息内容
	CreatedAt      string `json:"created_at"`       // 创建时间
	Duration       int    `json:"duration"`         // 时长（音频、视频、音视频通话）

	// 通话专用字段
	CallID     string `json:"call_id,omitempty"`     // 通话唯一ID
	CallStatus string `json:"call_status,omitempty"` // 通话状态:invite/accepted/rejected/ended/candidate/offer/answer
}

/**
 * RedisMessage
 * 结构体：Redis Pub/Sub 消息结构。
 * 用途：用于跨节点消息转发。
 */
// Redis 消息结构
type RedisMessage struct {
	SenderNodeID string `json:"sender_node_id"` // 发送节点ID
	ClientID     string `json:"client_id"`      // 目标客户端ID
	Message      string `json:"message"`        // 消息内容
}

// 用户绑定请求结构
type BindRequest struct {
	UserID   string `json:"user_id"`   // 用户ID
	ClientID string `json:"client_id"` // 客户端ID
	Token    string `json:"token"`     // 认证Token
}

/**
 * AuthResponse
 * 结构体：认证响应结构
 * 用途：返回给客户端的认证状态
 */
type AuthResponse struct {
	AuthStatus string `json:"auth_status"`        // 认证状态: success/failed/token_expired
	Message    string `json:"message"`            // 消息说明
	ClientID   string `json:"clientId,omitempty"` // 客户端ID
}

/**
 * ClientInfo
 * 结构体：客户端连接信息（包含认证信息）
 * 用途：存储已连接客户端的认证状态和token
 */
type ClientInfo struct {
	ClientID      string    `json:"client_id"`       // 客户端ID
	UserID        string    `json:"user_id"`         // 用户ID
	UserType      string    `json:"user_type"`       // 用户类型: user/doctor
	Token         string    `json:"token"`           // 认证Token
	IsAuth        bool      `json:"is_auth"`         // 是否已认证
	AuthTime      time.Time `json:"auth_time"`       // 认证时间
	LastCheckTime time.Time `json:"last_check_time"` // 上次检查时间
}

/**
 * CallSignal
 * 结构体：WebRTC 信令数据载荷。
 */
// 通话信令结构
type CallSignal struct {
	CallStatus string `json:"call_status"` // 动作: invite/accept/reject/end/candidate/offer/answer
	CallType   int    `json:"call_type"`   // 通话类型:6=视频,7=语音
	CallID     string `json:"call_id"`     // 通话唯一ID
	CallerID   string `json:"caller_id"`   // 主叫用户ID
	CalleeID   string `json:"callee_id"`   // 被叫用户ID
	Data       string `json:"data"`        // 数据(SDP/ICE候选)
}

// WebRTC信令数据结构
type WebRTCSignalData struct {
	Type          string      `json:"type"`                    // offer/answer/candidate
	SDP           string      `json:"sdp,omitempty"`           // SDP数据
	Candidate     interface{} `json:"candidate,omitempty"`     // ICE候选数据
	SDPMid        string      `json:"sdpMid,omitempty"`        // SDP媒体标识
	SDPMLineIndex int         `json:"sdpMLineIndex,omitempty"` // SDP行索引
}

// 通话状态常量
const (
	CallStatusInvite       = "invite"       // 发起邀请
	CallStatusAccepted     = "accepted"     // 接受通话
	CallStatusRejected     = "rejected"     // 拒绝通话
	CallStatusEnded        = "ended"        // 结束通话
	CallStatusOffer        = "offer"        // WebRTC Offer
	CallStatusAnswer       = "answer"       // WebRTC Answer
	CallStatusCandidate    = "candidate"    // ICE候选
	CallStatusHangup       = "hangup"       // 挂断
	CallStatusDisconnected = "disconnected" // 断开连接
	CallStatusTerminated   = "terminated"   // 终止
	CallStatusNoAnswer     = "no-answer"    // 无人接听
	CallStatusBusy         = "busy"         // 忙线
	CallStatusFailed       = "failed"       // 失败
	CallStatusConnecting   = "connecting"   // 连接中
)

// 消息类型常量
const (
	MessageTypeText              = 0  // 文本消息
	MessageTypeImage             = 1  // 图片消息
	MessageTypeAudio             = 2  // 音频消息
	MessageTypeVideo             = 3  // 视频消息
	MessageTypePrescription      = 4  // 处方消息
	MessageTypeMedicalRecord     = 5  // 病例消息
	MessageTypeVideoCall         = 6  // 视频通话
	MessageTypeAudioCall         = 7  // 语音通话
	MessageTypeFile              = 8  // 文件消息
	MessageTypeSystem            = 9  // 系统消息
	MessageTypeRegister          = 10 // 挂号信息
	MessageTypePatientExperience = 11 // 患者就诊经历卡片
	MessageTypeProductCard       = 12 // 商品卡片
	MessageTypeEndConsultation   = 13 // 结束问诊卡片
)

// Redis键常量
const (
	ClientUserKey       = "client_user_mapping"         // clientid -> userid映射
	UserClientKey       = "user_client_mapping"         // userid -> clientid列表
	TokenKeyPrefix      = "xiaokang_database_xk_user_"  // Mobile token存储前缀 (Redis DB 1) - 包含Laravel全局前缀
	AdminTokenKeyPrefix = "xiaokang_database_xk_login_" // Admin token存储前缀 (Redis DB 0) - 包含Laravel全局前缀
)

// 用户类型常量
const (
	UserTypeDoctor = "doctor" // 后台用户类型（PC管理端）
	UserTypeUser   = "user"   // 小程序用户类型
)

// 响应结构
type APIResponse struct {
	Status  string      `json:"status"`
	Message string      `json:"message"`
	Data    interface{} `json:"data,omitempty"`
	Error   string      `json:"error,omitempty"`
}

// 健康检查响应
type HealthResponse struct {
	Status string `json:"status"`
	Node   string `json:"node"`
	Port   string `json:"port"`
	Time   string `json:"time"`
}

// 绑定响应
type BindResponse struct {
	Status   string `json:"status"`
	Message  string `json:"message"`
	UserID   string `json:"user_id"`
	ClientID string `json:"client_id"`
}
