package notify

import (
	"fmt"
	"strings"

	opent "github.com/tidbcloud/devops/entity/operation"
	larkutil "github.com/tidbcloud/devops/pkg/infra/clients/larkcli/util"
)

type LarkUser struct {
	Email  string
	LarkID *string // nil mean cannot got lark id
}

type OperationNotifyParam struct {
	InstanceID uint64
	Operation  string
	Reason     string
	Params     map[opent.ParamName]string
	DetailURL  string
	Applicant  LarkUser
	OnCallers  []LarkUser
}

func (m OperationNotifyParam) Message(cards MessageCardSet) (larkutil.IMMessage, error) {
	paramItems := make([]string, 0, len(m.Params))
	for k, v := range m.Params {
		paramItems = append(paramItems, fmt.Sprintf("%s: %s", k, v))
	}

	atUsers := make([]string, 0, len(m.OnCallers))
	for _, onCaller := range m.OnCallers {
		text := onCaller.Email
		if onCaller.LarkID != nil {
			text = larkutil.AtUserInCard(*onCaller.LarkID)
		}
		atUsers = append(atUsers, text)
	}

	applicantText := m.Applicant.Email
	if m.Applicant.LarkID != nil {
		applicantText = larkutil.AtUserInCard(*m.Applicant.LarkID)
	}

	return larkutil.IMMessageCardTemplate{
		MType: "template",
		Data: larkutil.IMMessageCardTemplateData{
			ID: cards.OperationNotify,
			Vars: map[string]string{
				"instance_id":  fmt.Sprintf("%d", m.InstanceID),
				"applicant":    applicantText,
				"operation":    m.Operation,
				"reason":       m.Reason,
				"params":       larkutil.FormatItems(paramItems, "  ", "- "),
				"at_oncallers": strings.Join(atUsers, " "),
				"detail":       m.DetailURL,
			},
		},
	}, nil
}
