package feishubot

import (
	"fmt"

	"github.com/mohae/deepcopy"
)

type CardElementField struct {
	IsShort bool `json:"is_short"`
	Text    struct {
		Tag     string `json:"tag"`
		Content string `json:"content"`
	} `json:"text"`
}

type CardElementElement struct {
	Tag     string `json:"tag"`
	Content string `json:"content"`
}

type CardElementText struct {
	Tag     string `json:"tag,omitempty"`
	Content string `json:"content,omitempty"`
}

type CardElementExtra struct {
	Tag         string           `json:"tag,omitempty"`
	Type        string           `json:"type,omitempty"`
	Text        *CardElementText `json:"text,omitempty"`
	Placeholder *CardElementText `json:"placeholder,omitempty"`
	Value       struct {
		WorkCategory string `json:"work-category"`
	} `json:"value"`
	Options []struct {
		Text struct {
			Tag     string `json:"tag"`
			Content string `json:"content"`
		} `json:"text"`
		Value string `json:"value"`
	} `json:"options,omitempty"`
}

type CardElement struct {
	Tag      string               `json:"tag"`
	Text     *CardElementText     `json:"text,omitempty"`
	Extra    *CardElementExtra    `json:"extra,omitempty"`
	Fields   []CardElementField   `json:"fields,omitempty"`
	Elements []CardElementElement `json:"elements,omitempty"`
}

type CardTemplate struct {
	Config struct {
		WideScreenMode bool `json:"wide_screen_mode"`
	} `json:"config"`
	Header struct {
		Template string `json:"template"`
		Title    struct {
			Content string `json:"content"`
			Tag     string `json:"tag"`
		} `json:"title"`
	} `json:"header"`
	Elements []CardElement `json:"elements"`
}

func (card *CardTemplate) Copy() *CardTemplate {
	newCard := deepcopy.Copy(card).(*CardTemplate)
	return newCard
}

func (card *CardTemplate) Replace(replaceData interface{}) {
	card.Header.Title.Content = replace(card.Header.Title.Content, replaceData)
	for i := range card.Elements {
		if card.Elements[i].Text != nil {
			card.Elements[i].Text.Content = replace(card.Elements[i].Text.Content, replaceData)
		}
	}
}

func AddHr() CardElement {
	return CardElement{Tag: "hr"}
}

func AddNoteReport(url string) CardElement {
	return CardElement{Tag: "note", Elements: []CardElementElement{
		{
			Tag:     "lark_md",
			Content: fmt.Sprintf(`🔍 [查看报告](%s)`, url),
		},
	}}
}

func AddThanks(message string) CardElement {
	element := CardElement{}
	element.Tag = "div"
	element.Text = new(CardElementText)
	element.Text.Tag = "lark_md"
	element.Text.Content = fmt.Sprintf("***%s***", message)

	element.Extra = new(CardElementExtra)
	element.Extra.Tag = "button"
	element.Extra.Type = "default"
	element.Extra.Text = new(CardElementText)
	element.Extra.Text.Tag = "lark_md"
	element.Extra.Text.Content = "重新填写"
	element.Extra.Value.WorkCategory = "rewrite"

	return element
}
