package util

import (
	"encoding/json"

	larkcard "github.com/larksuite/oapi-sdk-go/v3/card"
)

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 larkcard.MessageCard

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

type LarkWebhookMessageReq struct {
	MsgType string      `json:"msg_type"`
	Card    interface{} `json:"card"`
}
