// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package apistruct

import (
	"encoding/json"
	"fmt"
	"strconv"

	pbmsg "git.imall.cloud/openim/protocol/msg"
	"git.imall.cloud/openim/protocol/sdkws"
)

// SendMsg defines the structure for sending messages with various metadata.
type SendMsg struct {
	// SendID uniquely identifies the sender.
	SendID string `json:"sendID" binding:"required"`

	// GroupID is the identifier for the group, required if SessionType is 2 or 3.
	GroupID string `json:"groupID" binding:"required_if=SessionType 2|required_if=SessionType 3"`

	// SenderNickname is the nickname of the sender.
	SenderNickname string `json:"senderNickname"`

	// SenderFaceURL is the URL to the sender's avatar.
	SenderFaceURL string `json:"senderFaceURL"`

	// SenderPlatformID is an integer identifier for the sender's platform.
	SenderPlatformID int32 `json:"senderPlatformID"`

	// Content is the actual content of the message, required and excluded from Swagger documentation.
	Content map[string]any `json:"content" binding:"required" swaggerignore:"true"`

	// ContentType is an integer that represents the type of the content.
	ContentType int32 `json:"contentType" binding:"required"`

	// SessionType is an integer that represents the type of session for the message.
	SessionType int32 `json:"sessionType" binding:"required"`

	// IsOnlineOnly specifies if the message is only sent when the receiver is online.
	IsOnlineOnly bool `json:"isOnlineOnly"`

	// NotOfflinePush specifies if the message should not trigger offline push notifications.
	NotOfflinePush bool `json:"notOfflinePush"`

	// SendTime is a timestamp indicating when the message was sent.
	SendTime int64 `json:"sendTime"`

	// OfflinePushInfo contains information for offline push notifications.
	OfflinePushInfo *sdkws.OfflinePushInfo `json:"offlinePushInfo"`

	// Ex stores extended fields
	Ex string `json:"ex"`
}

// SendMsgReq extends SendMsg with the requirement of RecvID when SessionType indicates a one-on-one or notification chat.
type SendMsgReq struct {
	// RecvID uniquely identifies the receiver and is required for one-on-one or notification chat types.
	RecvID string `json:"recvID" binding:"required_if" message:"recvID is required if sessionType is SingleChatType or NotificationChatType"`
	SendMsg
}

type GetConversationListReq struct {
	// userID uniquely identifies the user.
	UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty" binding:"required"`

	// ConversationIDs contains a list of unique identifiers for conversations.
	ConversationIDs []string `protobuf:"bytes,2,rep,name=conversationIDs,proto3" json:"conversationIDs,omitempty"`
}

type GetConversationListResp struct {
	// ConversationElems is a map that associates conversation IDs with their respective details.
	ConversationElems map[string]*ConversationElem `protobuf:"bytes,1,rep,name=conversationElems,proto3" json:"conversationElems,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

type ConversationElem struct {
	// MaxSeq represents the maximum sequence number within the conversation.
	MaxSeq int64 `protobuf:"varint,1,opt,name=maxSeq,proto3" json:"maxSeq,omitempty"`

	// UnreadSeq represents the number of unread messages in the conversation.
	UnreadSeq int64 `protobuf:"varint,2,opt,name=unreadSeq,proto3" json:"unreadSeq,omitempty"`

	// LastSeqTime represents the timestamp of the last sequence in the conversation.
	LastSeqTime int64 `protobuf:"varint,3,opt,name=LastSeqTime,proto3" json:"LastSeqTime,omitempty"`
}

// BatchSendMsgReq defines the structure for sending a message to multiple recipients.
type BatchSendMsgReq struct {
	SendMsg

	// IsSendAll indicates whether the message should be sent to all users.
	IsSendAll bool `json:"isSendAll"`

	// RecvIDs is a slice of receiver identifiers to whom the message will be sent, required field.
	RecvIDs []string `json:"recvIDs" binding:"required"`
}

// BatchSendMsgResp contains the results of a batch message send operation.
type BatchSendMsgResp struct {
	// Results is a slice of SingleReturnResult, representing the outcome of each message sent.
	Results []*SingleReturnResult `json:"results"`

	// FailedIDs is a slice of user IDs for whom the message send failed.
	FailedIDs []string `json:"failedUserIDs"`
}

// SendRedPacketReq 发送红包请求
type SendRedPacketReq struct {
	GroupID       string `json:"groupID"       binding:"required"` // 群ID
	RedPacketType int32  `json:"redPacketType" binding:"required"` // 红包类型：1-普通红包，2-拼手气红包
	TotalAmount   int64  `json:"totalAmount"   binding:"required"` // 总金额（分）
	TotalCount    int32  `json:"totalCount"    binding:"required"` // 总个数
	Blessing      string `json:"blessing"`                         // 祝福语
}

// SendRedPacketResp 发送红包响应
type SendRedPacketResp struct {
	RedPacketID string `json:"redPacketID"` // 红包ID
	ServerMsgID string `json:"serverMsgID"` // 消息ID
	ClientMsgID string `json:"clientMsgID"` // 客户端消息ID
	SendTime    int64  `json:"sendTime"`    // 发送时间
}

// ReceiveRedPacketReq 领取红包请求
type ReceiveRedPacketReq struct {
	RedPacketID string `json:"redPacketID" binding:"required"` // 红包ID
}

// ReceiveRedPacketResp 领取红包响应
type ReceiveRedPacketResp struct {
	RedPacketID string `json:"redPacketID"` // 红包ID
	Amount      int64  `json:"amount"`      // 领取金额（分）
	IsLucky     bool   `json:"isLucky"`     // 是否为手气最佳（仅拼手气红包有效）
}

// GetRedPacketsByGroupReq 根据群ID查询红包列表请求（群ID为选填，不填则查询所有红包）
type GetRedPacketsByGroupReq struct {
	GroupID    string     `json:"groupID"`    // 群ID（选填，不填则查询所有红包）
	Pagination Pagination `json:"pagination"` // 分页参数
}

// Pagination 分页参数
type Pagination struct {
	PageNumber int32 `json:"pageNumber"` // 页码，从1开始
	ShowNumber int32 `json:"showNumber"` // 每页数量
}

// GetRedPacketsByGroupResp 根据群ID查询红包列表响应
type GetRedPacketsByGroupResp struct {
	Total      int64            `json:"total"`      // 总数
	RedPackets []*RedPacketInfo `json:"redPackets"` // 红包列表
}

// RedPacketInfo 红包信息
type RedPacketInfo struct {
	RedPacketID   string `json:"redPacketID"`   // 红包ID
	SendUserID    string `json:"sendUserID"`    // 发送者ID
	GroupID       string `json:"groupID"`       // 群ID
	GroupName     string `json:"groupName"`     // 群名称
	RedPacketType int32  `json:"redPacketType"` // 红包类型：1-普通红包，2-拼手气红包
	TotalAmount   int64  `json:"totalAmount"`   // 总金额（分）
	TotalCount    int32  `json:"totalCount"`    // 总个数
	RemainAmount  int64  `json:"remainAmount"`  // 剩余金额（分）
	RemainCount   int32  `json:"remainCount"`   // 剩余个数
	Blessing      string `json:"blessing"`      // 祝福语
	Status        int32  `json:"status"`        // 状态：0-进行中，1-已领完，2-已过期
	ExpireTime    int64  `json:"expireTime"`    // 过期时间戳（毫秒）
	CreateTime    int64  `json:"createTime"`    // 创建时间戳（毫秒）
}

// GetRedPacketReceiveInfoReq 查询红包领取情况请求
type GetRedPacketReceiveInfoReq struct {
	RedPacketID string `json:"redPacketID" binding:"required"` // 红包ID
}

// GetRedPacketReceiveInfoResp 查询红包领取情况响应
type GetRedPacketReceiveInfoResp struct {
	RedPacketID  string                    `json:"redPacketID"`  // 红包ID
	TotalAmount  int64                     `json:"totalAmount"`  // 总金额（分）
	TotalCount   int32                     `json:"totalCount"`   // 总个数
	RemainAmount int64                     `json:"remainAmount"` // 剩余金额（分）
	RemainCount  int32                     `json:"remainCount"`  // 剩余个数
	Status       int32                     `json:"status"`       // 状态：0-进行中，1-已领完，2-已过期
	Receives     []*RedPacketReceiveDetail `json:"receives"`     // 领取记录列表
}

// RedPacketReceiveDetail 红包领取详情（后台管理接口使用）
type RedPacketReceiveDetail struct {
	ReceiveID     string `json:"receiveID"`     // 领取记录ID
	ReceiveUserID string `json:"receiveUserID"` // 领取者ID
	Amount        int64  `json:"amount"`        // 领取金额（分）
	ReceiveTime   int64  `json:"receiveTime"`   // 领取时间戳（毫秒）
	IsLucky       bool   `json:"isLucky"`       // 是否为手气最佳（仅拼手气红包有效）
}

// PauseRedPacketReq 暂停红包请求
type PauseRedPacketReq struct {
	RedPacketID string `json:"redPacketID" binding:"required"` // 红包ID
}

// PauseRedPacketResp 暂停红包响应
type PauseRedPacketResp struct {
	RedPacketID string `json:"redPacketID"` // 红包ID
}

// GetRedPacketDetailReq 查询红包详情请求（用户端）
type GetRedPacketDetailReq struct {
	RedPacketID string `json:"redPacketID" binding:"required"` // 红包ID（必填）
}

// GetRedPacketDetailResp 查询红包详情响应（用户端）
type GetRedPacketDetailResp struct {
	RedPacketID   string                        `json:"redPacketID"`   // 红包ID
	GroupID       string                        `json:"groupID"`       // 群ID
	RedPacketType int32                         `json:"redPacketType"` // 红包类型：1-普通红包，2-拼手气红包
	TotalAmount   int64                         `json:"totalAmount"`   // 总金额（分）
	TotalCount    int32                         `json:"totalCount"`    // 总个数
	RemainAmount  int64                         `json:"remainAmount"`  // 剩余金额（分）
	RemainCount   int32                         `json:"remainCount"`   // 剩余个数
	Blessing      string                        `json:"blessing"`      // 祝福语
	Status        int32                         `json:"status"`        // 状态：0-进行中，1-已领完，2-已过期
	IsExpired     bool                          `json:"isExpired"`     // 是否过期（超过一周）
	MyReceive     *RedPacketMyReceiveDetail     `json:"myReceive"`     // 当前用户的领取信息（如果已领取）
	Receives      []*RedPacketUserReceiveDetail `json:"receives"`      // 领取记录列表（仅群主/管理员可见）
}

// RedPacketMyReceiveDetail 当前用户自己的领取详情（不包含用户ID、昵称、头像）
type RedPacketMyReceiveDetail struct {
	ReceiveID   string `json:"receiveID"`   // 领取记录ID
	Amount      int64  `json:"amount"`      // 领取金额（分）
	ReceiveTime int64  `json:"receiveTime"` // 领取时间戳（毫秒）
	IsLucky     bool   `json:"isLucky"`     // 是否为手气最佳（仅拼手气红包有效）
}

// RedPacketUserReceiveDetail 红包用户领取详情（用户端，包含用户信息）
type RedPacketUserReceiveDetail struct {
	ReceiveID     string `json:"receiveID"`     // 领取记录ID
	ReceiveUserID string `json:"receiveUserID"` // 领取者ID
	Nickname      string `json:"nickname"`      // 领取者昵称
	FaceURL       string `json:"faceURL"`       // 领取者头像
	Amount        int64  `json:"amount"`        // 领取金额（分）
	ReceiveTime   int64  `json:"receiveTime"`   // 领取时间戳（毫秒）
	IsLucky       bool   `json:"isLucky"`       // 是否为手气最佳（仅拼手气红包有效）
}

// GetWalletsReq 查询用户钱包列表请求（后台管理接口）
type GetWalletsReq struct {
	UserID      string     `json:"userID"`      // 用户ID（选填，支持通过ID、手机号、账号查询）
	PhoneNumber string     `json:"phoneNumber"` // 手机号（选填，支持通过ID、手机号、账号查询）
	Account     string     `json:"account"`     // 账号（选填，支持通过ID、手机号、账号查询）
	Pagination  Pagination `json:"pagination"`  // 分页参数
}

// GetWalletsResp 查询用户钱包列表响应
type GetWalletsResp struct {
	Total   int64         `json:"total"`   // 总数
	Wallets []*WalletInfo `json:"wallets"` // 钱包列表
}

// WalletInfo 钱包信息
type WalletInfo struct {
	UserID     string `json:"userID"`     // 用户ID
	Nickname   string `json:"nickname"`   // 用户昵称
	FaceURL    string `json:"faceURL"`    // 用户头像
	Balance    int64  `json:"balance"`    // 余额（分）
	CreateTime int64  `json:"createTime"` // 创建时间戳（毫秒）
	UpdateTime int64  `json:"updateTime"` // 更新时间戳（毫秒）
}

// BatchUpdateWalletBalanceReq 批量修改用户余额请求（后台管理接口）
type BatchUpdateWalletBalanceReq struct {
	Users     []WalletUserIdentifier `json:"users" binding:"required"` // 用户标识列表（支持用户ID、手机号、账号）
	Amount    int64                  `json:"amount"`                   // 默认金额（分），如果用户没有指定金额则使用此值
	Operation string                 `json:"operation"`                // 默认操作类型：set（设置为指定金额）、add（增加金额）、subtract（减少金额），默认为add
}

// WalletUserIdentifier 钱包用户标识（支持用户ID、手机号、账号）
type WalletUserIdentifier struct {
	UserID      FlexibleString `json:"userID"`      // 用户ID（选填，支持数字和字符串）
	PhoneNumber string         `json:"phoneNumber"` // 手机号（选填）
	Account     string         `json:"account"`     // 账号（选填）
	Amount      int64          `json:"amount"`      // 金额（分），如果未指定则使用请求中的默认金额
	Operation   string         `json:"operation"`   // 操作类型：set（设置为指定金额）、add（增加金额）、subtract（减少金额），如果未指定则使用请求中的默认操作类型
	Remark      string         `json:"remark"`      // 备注（选填），每条修改记录对应的备注信息
}

// FlexibleString 灵活的字符串类型，可以接受数字和字符串
type FlexibleString string

// UnmarshalJSON 自定义JSON反序列化，支持数字和字符串
func (f *FlexibleString) UnmarshalJSON(data []byte) error {
	// 尝试解析为字符串
	var s string
	if err := json.Unmarshal(data, &s); err == nil {
		*f = FlexibleString(s)
		return nil
	}
	// 尝试解析为数字
	var num json.Number
	if err := json.Unmarshal(data, &num); err == nil {
		*f = FlexibleString(num.String())
		return nil
	}
	// 尝试解析为整数
	var i int64
	if err := json.Unmarshal(data, &i); err == nil {
		*f = FlexibleString(strconv.FormatInt(i, 10))
		return nil
	}
	// 尝试解析为浮点数
	var f64 float64
	if err := json.Unmarshal(data, &f64); err == nil {
		*f = FlexibleString(strconv.FormatFloat(f64, 'f', -1, 64))
		return nil
	}
	return fmt.Errorf("cannot unmarshal %s into FlexibleString", string(data))
}

// String 返回字符串值
func (f FlexibleString) String() string {
	return string(f)
}

// BatchUpdateWalletBalanceResp 批量修改用户余额响应
type BatchUpdateWalletBalanceResp struct {
	Total   int32                `json:"total"`   // 总处理数量
	Success int32                `json:"success"` // 成功数量
	Failed  int32                `json:"failed"`  // 失败数量
	Results []WalletUpdateResult `json:"results"` // 处理结果列表
}

// WalletUpdateResult 钱包更新结果
type WalletUpdateResult struct {
	UserID      string `json:"userID"`      // 用户ID
	PhoneNumber string `json:"phoneNumber"` // 手机号
	Account     string `json:"account"`     // 账号
	Success     bool   `json:"success"`     // 是否成功
	Message     string `json:"message"`     // 结果消息
	OldBalance  int64  `json:"oldBalance"`  // 修改前余额
	NewBalance  int64  `json:"newBalance"`  // 修改后余额
	Remark      string `json:"remark"`      // 备注信息
}

// SendSingleMsgReq defines the structure for sending a message to multiple recipients.
type SendSingleMsgReq struct {
	// groupMsg should appoint sendID
	SendID          string                 `json:"sendID"`
	Content         string                 `json:"content" binding:"required"`
	OfflinePushInfo *sdkws.OfflinePushInfo `json:"offlinePushInfo"`
	Ex              string                 `json:"ex"`
}

type KeyMsgData struct {
	SendID  string `json:"sendID"`
	RecvID  string `json:"recvID"`
	GroupID string `json:"groupID"`
}

// SingleReturnResult encapsulates the result of a single message send attempt.
type SingleReturnResult struct {
	// ServerMsgID is the message identifier on the server-side.
	ServerMsgID string `json:"serverMsgID"`

	// ClientMsgID is the message identifier on the client-side.
	ClientMsgID string `json:"clientMsgID"`

	// SendTime is the timestamp of when the message was sent.
	SendTime int64 `json:"sendTime"`

	// RecvID uniquely identifies the receiver of the message.
	RecvID string `json:"recvID"`

	// Modify fields modified via webhook.
	Modify map[string]any `json:"modify,omitempty"`
}

type SendMsgResp struct {
	// SendMsgResp original response.
	*pbmsg.SendMsgResp

	// Modify fields modified via webhook.
	Modify map[string]any `json:"modify,omitempty"`
}

// CreateMeetingReq 创建会议请求
type CreateMeetingReq struct {
	MeetingID      string   `json:"meetingID"`                        // 会议ID（选填，不填则自动生成）
	Subject        string   `json:"subject" binding:"required"`       // 会议主题（必填）
	CoverURL       string   `json:"coverURL"`                         // 封面URL
	ScheduledTime  int64    `json:"scheduledTime" binding:"required"` // 预约时间戳（毫秒，必填）
	Description    string   `json:"description"`                      // 会议描述
	Duration       int32    `json:"duration"`                         // 会议时长（分钟）
	EstimatedCount int32    `json:"estimatedCount"`                   // 会议预估人数
	EnableMic      bool     `json:"enableMic"`                        // 是否开启连麦
	EnableComment  bool     `json:"enableComment"`                    // 是否开启评论
	AnchorUserIDs  []string `json:"anchorUserIDs"`                    // 主播用户ID列表（多选）
	Password       string   `json:"password"`                         // 会议密码（6位数字，选填，不填则自动生成）
	Ex             string   `json:"ex"`                               // 扩展字段
}

// CreateMeetingResp 创建会议响应
type CreateMeetingResp struct {
	MeetingInfo *MeetingInfo `json:"meetingInfo"` // 会议信息
	GroupID     string       `json:"groupID"`     // 创建的群聊ID
}

// UpdateMeetingReq 更新会议请求
type UpdateMeetingReq struct {
	MeetingID      string   `json:"meetingID" binding:"required"` // 会议ID（必填）
	Subject        string   `json:"subject"`                      // 会议主题
	CoverURL       string   `json:"coverURL"`                     // 封面URL
	ScheduledTime  int64    `json:"scheduledTime"`                // 预约时间戳（毫秒）
	Status         int32    `json:"status"`                       // 会议状态：1-已预约，2-进行中，3-已结束，4-已取消
	Description    string   `json:"description"`                  // 会议描述
	Duration       int32    `json:"duration"`                     // 会议时长（分钟）
	EstimatedCount int32    `json:"estimatedCount"`               // 会议预估人数
	EnableMic      *bool    `json:"enableMic"`                    // 是否开启连麦（使用指针以区分是否设置）
	EnableComment  *bool    `json:"enableComment"`                // 是否开启评论（使用指针以区分是否设置）
	AnchorUserIDs  []string `json:"anchorUserIDs"`                // 主播用户ID列表（多选）
	Password       *string  `json:"password"`                     // 会议密码（6位数字，使用指针以区分是否设置）
	Ex             string   `json:"ex"`                           // 扩展字段
}

// UpdateMeetingResp 更新会议响应
type UpdateMeetingResp struct {
	MeetingInfo *MeetingInfo `json:"meetingInfo"` // 会议信息
}

// GetMeetingsReq 获取会议列表请求
type GetMeetingsReq struct {
	CreatorUserID string     `json:"creatorUserID"` // 创建者用户ID（选填）
	Status        int32      `json:"status"`        // 会议状态（选填）：1-已预约，2-进行中，3-已结束，4-已取消
	Keyword       string     `json:"keyword"`       // 搜索关键词（选填，搜索主题和描述）
	StartTime     int64      `json:"startTime"`     // 开始时间戳（毫秒，选填）
	EndTime       int64      `json:"endTime"`       // 结束时间戳（毫秒，选填）
	Pagination    Pagination `json:"pagination"`    // 分页参数
}

// GetMeetingsResp 获取会议列表响应
type GetMeetingsResp struct {
	Total    int64          `json:"total"`    // 总数
	Meetings []*MeetingInfo `json:"meetings"` // 会议列表
}

// DeleteMeetingReq 删除会议请求
type DeleteMeetingReq struct {
	MeetingID string `json:"meetingID" binding:"required"` // 会议ID（必填）
}

// DeleteMeetingResp 删除会议响应
type DeleteMeetingResp struct {
}

// MeetingInfo 会议信息
type MeetingInfo struct {
	MeetingID      string            `json:"meetingID"`      // 会议ID
	Subject        string            `json:"subject"`        // 会议主题
	CoverURL       string            `json:"coverURL"`       // 封面URL
	ScheduledTime  int64             `json:"scheduledTime"`  // 预约时间戳（毫秒）
	Status         int32             `json:"status"`         // 会议状态：1-已预约，2-进行中，3-已结束，4-已取消
	CreatorUserID  string            `json:"creatorUserID"`  // 创建者用户ID
	Description    string            `json:"description"`    // 会议描述
	Duration       int32             `json:"duration"`       // 会议时长（分钟）
	EstimatedCount int32             `json:"estimatedCount"` // 会议预估人数
	EnableMic      bool              `json:"enableMic"`      // 是否开启连麦
	EnableComment  bool              `json:"enableComment"`  // 是否开启评论
	AnchorUserIDs  []string          `json:"anchorUserIDs"`  // 主播用户ID列表（多选）
	AnchorUsers    []*sdkws.UserInfo `json:"anchorUsers"`    // 主播用户信息列表
	CreateTime     int64             `json:"createTime"`     // 创建时间戳（毫秒）
	UpdateTime     int64             `json:"updateTime"`     // 更新时间戳（毫秒）
	Ex             string            `json:"ex"`             // 扩展字段
	GroupID        string            `json:"groupID"`        // 关联的群聊ID
	CheckInCount   int32             `json:"checkInCount"`   // 签到人数统计
	Password       string            `json:"password"`       // 会议密码（6位数字）
}

// GetMeetingReq 获取会议请求（用户端）
type GetMeetingReq struct {
	MeetingID string `json:"meetingID" binding:"required"` // 会议ID（必填）
}

// GetMeetingResp 获取会议响应（用户端）
type GetMeetingResp struct {
	MeetingInfo *MeetingPublicInfo `json:"meetingInfo"` // 会议信息
}

// GetMeetingsPublicReq 获取会议列表请求（用户端）
type GetMeetingsPublicReq struct {
	Status     int32      `json:"status"`     // 会议状态（选填）：1-已预约，2-进行中，3-已结束，4-已取消
	Keyword    string     `json:"keyword"`    // 搜索关键词（选填，搜索主题和描述）
	StartTime  int64      `json:"startTime"`  // 开始时间戳（毫秒，选填）
	EndTime    int64      `json:"endTime"`    // 结束时间戳（毫秒，选填）
	Pagination Pagination `json:"pagination"` // 分页参数
}

// GetMeetingsPublicResp 获取会议列表响应（用户端）
type GetMeetingsPublicResp struct {
	Total    int64                `json:"total"`    // 总数
	Meetings []*MeetingPublicInfo `json:"meetings"` // 会议列表
}

// MeetingPublicInfo 会议公开信息（用户端，过滤了管理字段）
type MeetingPublicInfo struct {
	MeetingID      string            `json:"meetingID"`      // 会议ID
	Subject        string            `json:"subject"`        // 会议主题
	CoverURL       string            `json:"coverURL"`       // 封面URL
	ScheduledTime  int64             `json:"scheduledTime"`  // 预约时间戳（毫秒）
	Status         int32             `json:"status"`         // 会议状态：1-已预约，2-进行中，3-已结束，4-已取消
	Description    string            `json:"description"`    // 会议描述
	Duration       int32             `json:"duration"`       // 会议时长（分钟）
	EstimatedCount int32             `json:"estimatedCount"` // 会议预估人数
	EnableMic      bool              `json:"enableMic"`      // 是否开启连麦
	EnableComment  bool              `json:"enableComment"`  // 是否开启评论
	AnchorUsers    []*sdkws.UserInfo `json:"anchorUsers"`    // 主播用户信息列表
	GroupID        string            `json:"groupID"`        // 关联的群聊ID
	CheckInCount   int32             `json:"checkInCount"`   // 签到人数统计
	Password       string            `json:"password"`       // 会议密码（6位数字）
}

// CheckInMeetingReq 会议签到请求
type CheckInMeetingReq struct {
	MeetingID string `json:"meetingID" binding:"required"` // 会议ID（必填）
}

// CheckInMeetingResp 会议签到响应
type CheckInMeetingResp struct {
	CheckInID   string `json:"checkInID"`   // 签到ID
	CheckInTime int64  `json:"checkInTime"` // 签到时间戳（毫秒）
}

// GetMeetingCheckInsReq 获取会议签到列表请求
type GetMeetingCheckInsReq struct {
	MeetingID  string     `json:"meetingID" binding:"required"` // 会议ID（必填）
	Pagination Pagination `json:"pagination"`                   // 分页参数
}

// GetMeetingCheckInsResp 获取会议签到列表响应
type GetMeetingCheckInsResp struct {
	Total    int64                 `json:"total"`    // 总数
	CheckIns []*MeetingCheckInInfo `json:"checkIns"` // 签到列表
}

// MeetingCheckInInfo 会议签到信息
type MeetingCheckInInfo struct {
	CheckInID   string          `json:"checkInID"`   // 签到ID
	MeetingID   string          `json:"meetingID"`   // 会议ID
	UserID      string          `json:"userID"`      // 用户ID
	CheckInTime int64           `json:"checkInTime"` // 签到时间戳（毫秒）
	UserInfo    *sdkws.UserInfo `json:"userInfo"`    // 用户信息
}

// GetMeetingCheckInStatsReq 获取会议签到统计请求
type GetMeetingCheckInStatsReq struct {
	MeetingID string `json:"meetingID" binding:"required"` // 会议ID（必填）
}

// GetMeetingCheckInStatsResp 获取会议签到统计响应
type GetMeetingCheckInStatsResp struct {
	MeetingID    string `json:"meetingID"`    // 会议ID
	CheckInCount int64  `json:"checkInCount"` // 签到人数
}

// CheckUserCheckInReq 检查用户是否已签到请求
type CheckUserCheckInReq struct {
	MeetingID string `json:"meetingID" binding:"required"` // 会议ID（必填）
}

// CheckUserCheckInResp 检查用户是否已签到响应
type CheckUserCheckInResp struct {
	IsCheckedIn bool                `json:"isCheckedIn"`           // 是否已签到
	CheckInInfo *MeetingCheckInInfo `json:"checkInInfo,omitempty"` // 签到信息（如果已签到）
}
