package util

import (
	"encoding/json"
)

func EncodeIMMessage(msg IMMessage) (string, error) {
	data, err := json.Marshal(msg)
	if err != nil {
		return "", err
	}
	return string(data), nil
}

// Message is the interface for lark message
//
// Reference: https://open.feishu.cn/document/server-docs/im-v1/message-content-description/create_json#c9e08671
type IMMessage interface {
	Type() string
}

// Reference: https://open.feishu.cn/document/server-docs/im-v1/message-content-description/create_json#c9e08671
type IMMessageText struct {
	Text string `json:"text"`
}

func (m IMMessageText) Type() string {
	return "text"
}

type IMMessageCardTemplateData struct {
	ID   string            `json:"template_id"`
	Vars map[string]string `json:"template_variable"`
}

// Reference: https://open.feishu.cn/document/server-docs/im-v1/message-content-description/create_json#11e75d0
type IMMessageCardTemplate struct {
	MType string                    `json:"type"` // template
	Data  IMMessageCardTemplateData `json:"data"`
}

func (m IMMessageCardTemplate) Type() string {
	return "interactive"
}

type IMMessageCardBody struct {
	MsgType string    `json:"msg_type"` // interactive
	Card    IMMessage `json:"card"`
}

func (m IMMessageCardBody) Type() string { return "interactive" }

// Reference: https://open.feishu.cn/document/server-docs/im-v1/message-content-description/create_json#7111df05
type IMMessageImage struct {
	ImageKey string `json:"image_key"`
}

func (m IMMessageImage) Type() string {
	return "image"
}

type IMMessageFile struct {
	FileKey string `json:"file_key"`
}

func (m IMMessageFile) Type() string {
	return "file"
}
