package bridge

import "time"

// UnifiedMessage is the internal message format all platforms convert to.
type UnifiedMessage struct {
	SenderID   string `json:"sender_id"`
	SenderName string `json:"sender_name"`

	Platform    string `json:"platform"`
	ChannelID   string `json:"channel_id"`
	ChannelType string `json:"channel_type"` // "direct", "group", "channel"

	Content     string       `json:"content"`
	ContentType string       `json:"content_type"` // "text", "image", "voice", "file", "mixed"
	Attachments []Attachment `json:"attachments,omitempty"`

	MessageID string `json:"message_id,omitempty"`
	ReplyTo   string `json:"reply_to,omitempty"`
	Mentions  []string `json:"mentions,omitempty"`

	RawData   interface{} `json:"raw_data,omitempty"`
	Timestamp time.Time   `json:"timestamp"`

	// Routing metadata.
	RouteType           string      `json:"route_type,omitempty"`            // "normal", "silent", "admin_mention"
	OriginalSenderUID   string      `json:"original_sender_uid,omitempty"`   // preserved before identity mapping
	OriginalSenderName  string      `json:"original_sender_name,omitempty"`  // preserved before identity mapping
	GroupName           string      `json:"group_name,omitempty"`            // resolved group name for group chats
	OriginalRawMessage  interface{} `json:"-"`                               // preserved for SendMessage wiring
	BotUID              string      `json:"-"`                               // bot's own platform UID, set by router
	AdapterName         string      `json:"-"`                               // adapter config name (e.g. "qq-main"), set by router
}

// Attachment represents a file/image/voice/video attachment.
type Attachment struct {
	Type     string `json:"type"` // "image", "voice", "file", "video"
	URL      string `json:"url,omitempty"`
	FileName string `json:"file_name,omitempty"`
	MimeType string `json:"mime_type,omitempty"`
	Size     int64  `json:"size,omitempty"`
	Duration int    `json:"duration,omitempty"` // video/voice duration in seconds
}

// UnifiedResponse is AI-Core's response converted to unified format.
type UnifiedResponse struct {
	Messages     []ResponseMessage `json:"messages"`
	ReplyTo      string            `json:"reply_to,omitempty"`
	Platform     string            `json:"platform"`
	PlatformHints PlatformHints     `json:"platform_hints,omitempty"`
}

// ResponseMessage is a single message in a response.
type ResponseMessage struct {
	DisplayType string `json:"display_type"` // "chat", "action", "thinking", "system_info", "tool_progress"
	Content     string `json:"content"`
	FormatMode  string `json:"format_mode"` // "plain", "markdown", "html"
}

// PlatformHints tells the adapter how to deliver the response.
type PlatformHints struct {
	TypingIndicator bool `json:"typing_indicator"` // show "typing..." before sending
	BurstMode       bool `json:"burst_mode"`       // send multiple messages rapidly
	ReplyAsThread   bool `json:"reply_as_thread"`    // reply in a thread
}

// PlatformCapabilities declares what a platform supports.
type PlatformCapabilities struct {
	MaxMessageLength   int  `json:"max_message_length"`
	SupportsMarkdown   bool `json:"supports_markdown"`
	SupportsImage      bool `json:"supports_image"`
	SupportsVoice      bool `json:"supports_voice"`
	SupportsEmoji      bool `json:"supports_emoji"`
	SupportsReaction   bool `json:"supports_reaction"`
	SupportsTypingHint bool `json:"supports_typing_hint"`
	RecommendBurstMax  int  `json:"recommend_burst_max"`
}

// PlatformMessage is the platform-specific message format returned by an adapter.
type PlatformMessage struct {
	Content     string            `json:"content"`
	FormatMode  string            `json:"format_mode,omitempty"`
	ReplyTo     string            `json:"reply_to,omitempty"`
	Metadata    map[string]string `json:"metadata,omitempty"`
	RawBody     interface{}       `json:"raw_body,omitempty"`
}
