package qq_message

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

// LocationMessage 位置消息
type LocationMessage struct {
	Type string              `json:"type"`
	Data LocationMessageData `json:"data"`
}

type LocationMessageData struct {
	Lat     float64 `json:"lat"`     // 纬度
	Lon     float64 `json:"lon"`     // 经度
	Title   string  `json:"title"`   // 标题
	Content string  `json:"content"` // 内容（地址）
}

func init() {
	RegisterMessageType(TypeLocation, func() QQMessage {
		return NewLocationMessage()
	})
}

func NewLocationMessage() *LocationMessage {
	return &LocationMessage{Type: TypeLocation}
}

func (msg *LocationMessage) GetMessageType() string {
	return TypeLocation
}

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

func (msg *LocationMessage) ToCQString() string {
	return fmt.Sprintf("[CQ:location,lat=%f,lon=%f,title=%s,content=%s]",
		msg.Data.Lat, msg.Data.Lon, msg.Data.Title, msg.Data.Content)
}

func (msg *LocationMessage) ParseMessage(data string) error {
	re := regexp.MustCompile(`\[CQ:location,lat=([\d.]+),lon=([\d.]+),title=(.*?),content=(.*?)\]`)
	matches := re.FindStringSubmatch(data)
	if len(matches) < 5 {
		return fmt.Errorf("位置消息格式不正确")
	}

	_, err := fmt.Sscanf(matches[1], "%f", &msg.Data.Lat)
	if err != nil {
		return fmt.Errorf("解析纬度失败: %v", err)
	}

	_, err = fmt.Sscanf(matches[2], "%f", &msg.Data.Lon)
	if err != nil {
		return fmt.Errorf("解析经度失败: %v", err)
	}

	msg.Data.Title = matches[3]
	msg.Data.Content = matches[4]
	return nil
}
