package notify

import (
	"strconv"
	"time"

	privent "github.com/tidbcloud/devops/entity/privilege"
	larkutil "github.com/tidbcloud/devops/pkg/infra/clients/larkcli/util"
)

type PrivilegeParam struct {
	ID         uint64
	Type       privent.PrivilegeType
	Content    privent.PrivilegeContent
	ExpireTime time.Time
	DetailLink string
}

func (m PrivilegeParam) message() larkutil.IMMessageCardTemplate {
	lines := []string{}
	if m.Type == privent.PrivilegeTypeApproval {
		for _, scope := range m.Content.Approval.Scopes {
			line := string(scope)
			switch scope {
			case privent.PrivilegeApprovalScopeJumpService:
				line = line + " - special approval flow when creating jump, see " + larkutil.LinkInText("Jump Privilege", "https://pingcap.feishu.cn/wiki/HSXRwxkyxiP8I7kIiegcnspBnpc#share-HstWdLZMVochIzxlbQtcbLAhnWg")
			}

			lines = append(lines, line)
		}
	}

	return larkutil.IMMessageCardTemplate{
		MType: "template",
		Data: larkutil.IMMessageCardTemplateData{
			ID: "",
			Vars: map[string]string{
				"id":          strconv.FormatUint(m.ID, 10),
				"type":        string(m.Type),
				"expired_at":  m.ExpireTime.Format(time.RFC3339),
				"content":     larkutil.FormatItems(lines, "", "- "),
				"detail_link": m.DetailLink,
			},
		},
	}
}

type PrivilegeGrantedParam struct {
	PrivilegeParam
}

func (m PrivilegeGrantedParam) Message(cards MessageCardSet) (larkutil.IMMessage, error) {
	imMsg := m.PrivilegeParam.message()
	imMsg.Data.ID = cards.PrivilegeGranted
	return imMsg, nil
}

type PrivilegeWillExpireParam struct {
	PrivilegeParam
}

func (m PrivilegeWillExpireParam) Message(cards MessageCardSet) (larkutil.IMMessage, error) {
	imMsg := m.PrivilegeParam.message()
	imMsg.Data.ID = cards.PrivilegeWillExpire
	return imMsg, nil
}

type PrivilegeRevokedParam struct {
	PrivilegeParam
}

func (m PrivilegeRevokedParam) Message(cards MessageCardSet) (larkutil.IMMessage, error) {
	imMsg := m.PrivilegeParam.message()
	imMsg.Data.ID = cards.PrivilegeRevoked
	return imMsg, nil
}
