package qq_message

import (
	"encoding/json"
	"fmt"
	"regexp"
)

// FileMessage 文件消息
type FileMessage struct {
	Type string          `json:"type"`
	Data FileMessageData `json:"data"`
}

type FileMessageData struct {
	File       string `json:"file"`                  // 文件路径
	Name       string `json:"name,omitempty"`        // 文件名
	URL        string `json:"url,omitempty"`         // 文件URL
	Path       string `json:"path,omitempty"`        // 文件路径
	FileID     string `json:"file_id,omitempty"`     // 文件ID
	FileSize   string `json:"file_size,omitempty"`   // 文件大小
	FileUnique string `json:"file_unique,omitempty"` // 文件唯一标识
}

func init() {
	RegisterMessageType(TypeFile, func() QQMessage {
		return NewFileMessage()
	})
}

func NewFileMessage() *FileMessage {
	return &FileMessage{Type: TypeFile}
}

func (msg *FileMessage) GetMessageType() string {
	return TypeFile
}

func (msg *FileMessage) SetData(data json.RawMessage) error {
	return json.Unmarshal(data, &msg.Data)
}

func (msg *FileMessage) ToCQString() string {
	base := fmt.Sprintf("[CQ:file,file=%s", msg.Data.File)
	if msg.Data.Name != "" {
		base += fmt.Sprintf(",name=%s", msg.Data.Name)
	}
	return base + "]"
}

func (msg *FileMessage) ParseMessage(data string) error {
	re := regexp.MustCompile(`\[CQ:file,file=(.*?)(?:,name=(.*?))?\]`)
	matches := re.FindStringSubmatch(data)
	if len(matches) < 2 {
		return fmt.Errorf("文件消息格式不正确")
	}
	msg.Data.File = matches[1]
	if len(matches) > 2 {
		msg.Data.Name = matches[2]
	}
	return nil
}
