package service

import "time"

// BroadcastHub 描述 WebSocket Hub 的广播能力。
type BroadcastHub interface {
	BroadcastMessage(conversationID uint, messageType string, data interface{})
	BroadcastToAllAgents(messageType string, data interface{})
}

// InitConversationInput 对话初始化需要的输入数据。
type InitConversationInput struct {
	VisitorID uint
	Website   string
	Referrer  string
	Browser   string
	OS        string
	Language  string
	IPAddress string
	ChatMode   string // 对话模式：human（人工客服）、ai（AI客服）
	AIConfigID *uint  // AI 配置 ID（访客选择的模型配置，AI 模式时必需）
}

// InitConversationResult 对话初始化后的返回结果。
type InitConversationResult struct {
	ConversationID uint
	Status         string
}

// UpdateConversationContactInput 更新访客联系信息时需要的参数。
type UpdateConversationContactInput struct {
	ConversationID uint
	Email          *string
	Phone          *string
	Notes          *string
}

// ConversationSummary 用于会话列表展示的概要信息。
type ConversationSummary struct {
	ID             uint
	VisitorID      uint
	AgentID        uint
	Status         string
	CreatedAt      time.Time
	UpdatedAt      time.Time
	LastMessage    *LastMessageSummary
	UnreadCount    int64
	LastSeenAt     *time.Time // 最后活跃时间，用于判断在线状态
	HasParticipated bool      // 当前用户是否参与过该会话（是否发送过消息）
}

// LastMessageSummary 会话最后一条消息的摘要信息。
type LastMessageSummary struct {
	ID            uint
	Content       string
	SenderIsAgent bool
	MessageType   string
	IsRead        bool
	ReadAt        *time.Time
	CreatedAt     time.Time
}

// ConversationDetail 在会话概要基础上附加访客信息。
type ConversationDetail struct {
	ConversationSummary
	Website   string
	Referrer  string
	Browser   string
	OS        string
	Language  string
	IPAddress string
	Location  string
	Email     string
	Phone     string
	Notes     string
	LastSeen  *time.Time
}

// CreateMessageInput 创建消息时需要的参数。
type CreateMessageInput struct {
	ConversationID uint
	Content        string
	SenderID       uint
	SenderIsAgent  bool
	// 文件相关字段（可选）
	FileURL  *string // 文件URL
	FileType *string // 文件类型：image, document
	FileName *string // 原始文件名
	FileSize *int64  // 文件大小（字节）
	MimeType *string // MIME类型
}

// CreateAgentInput 创建客服或管理员账号需要的参数。
type CreateAgentInput struct {
	Username string
	Password string
	Role     string
}

// MarkMessagesReadResult 消息标记已读后的返回信息。
type MarkMessagesReadResult struct {
	ConversationID uint
	MessageIDs     []uint
	UnreadCount    int64
	ReadAt         time.Time
}

// UpdateProfileInput 更新个人资料时需要的参数。
type UpdateProfileInput struct {
	UserID                 uint
	Nickname               *string
	Email                  *string
	ReceiveAIConversations *bool // 是否接收 AI 对话（可选）
}

// ProfileResult 个人资料信息。
type ProfileResult struct {
	ID                     uint   `json:"id"`
	Username               string `json:"username"`
	Role                   string `json:"role"`
	AvatarURL              string `json:"avatar_url"`
	Nickname               string `json:"nickname"`
	Email                  string `json:"email"`
	ReceiveAIConversations bool   `json:"receive_ai_conversations"` // 是否接收 AI 对话
}

// UserSummary 用户列表摘要信息（不包含密码）。
type UserSummary struct {
	ID                     uint      `json:"id"`
	Username               string    `json:"username"`
	Role                   string    `json:"role"`
	Nickname               string    `json:"nickname"`
	Email                  string    `json:"email"`
	AvatarURL              string    `json:"avatar_url"`
	ReceiveAIConversations bool      `json:"receive_ai_conversations"`
	CreatedAt              time.Time `json:"created_at"`
	UpdatedAt              time.Time `json:"updated_at"`
}

// CreateUserInput 创建用户输入。
type CreateUserInput struct {
	Username string  // 用户名（必需）
	Password string  // 密码（必需）
	Role     string  // 角色："admin" 或 "agent"（必需）
	Nickname *string // 昵称（可选）
	Email    *string // 邮箱（可选）
}

// UpdateUserInput 更新用户输入。
type UpdateUserInput struct {
	UserID                 uint    // 用户ID（必需）
	Role                   *string // 角色（可选）
	Nickname               *string // 昵称（可选）
	Email                  *string // 邮箱（可选）
	ReceiveAIConversations *bool   // 是否接收 AI 对话（可选）
}

// UpdatePasswordInput 更新密码输入。
type UpdatePasswordInput struct {
	UserID      uint    // 用户ID（必需）
	OldPassword *string // 旧密码（可选，管理员修改其他用户密码时不需要）
	NewPassword string  // 新密码（必需）
	IsAdmin     bool    // 是否是管理员操作（必需）
}

// FAQSummary FAQ（常见问题）摘要信息。
type FAQSummary struct {
	ID        uint      `json:"id"`
	Question  string    `json:"question"`  // 问题
	Answer    string    `json:"answer"`    // 答案
	Keywords  string    `json:"keywords"`  // 关键词（用于搜索）
	CreatedAt time.Time `json:"created_at"` // 创建时间
	UpdatedAt time.Time `json:"updated_at"` // 更新时间
}

// CreateFAQInput 创建 FAQ 输入。
type CreateFAQInput struct {
	Question string // 问题（必需）
	Answer   string // 答案（必需）
	Keywords string // 关键词（可选，用逗号或空格分隔）
}

// UpdateFAQInput 更新 FAQ 输入。
type UpdateFAQInput struct {
	Question *string // 问题（可选）
	Answer   *string // 答案（可选）
	Keywords *string // 关键词（可选）
}

// OnlineAgent 在线客服信息（供访客查看）。
type OnlineAgent struct {
	ID        uint   `json:"id"`         // 客服ID
	Nickname  string `json:"nickname"`   // 昵称
	AvatarURL string `json:"avatar_url"` // 头像URL
}
