package notify

import (
	"context"
	"strconv"
	"strings"
	"time"

	larkutil "github.com/tidbcloud/devops/pkg/infra/clients/larkcli/util"
	timeutil "github.com/tidbcloud/devops/pkg/infra/utils/time"
)

type MaintenanceTaskRunningParam struct {
	ProjectID    uint64
	Clusters     []uint64
	ScheduleTime time.Time
	OnCallers    []string
	DetailLink   string
}

func (m MaintenanceTaskRunningParam) Message(cards MessageCardSet) (larkutil.IMMessage, error) {
	clusterItems := make([]string, 0, len(m.Clusters))
	for _, clusterID := range m.Clusters {
		clusterItems = append(clusterItems, strconv.FormatUint(clusterID, 10))
	}
	atUsers := make([]string, 0, len(m.OnCallers))
	for _, onCaller := range m.OnCallers {
		atUsers = append(atUsers, larkutil.AtUserInCard(onCaller))
	}

	return larkutil.IMMessageCardTemplate{
		MType: "template",
		Data: larkutil.IMMessageCardTemplateData{
			ID: cards.MaintenanceTaskRunning,
			Vars: map[string]string{
				"project_id":    strconv.FormatUint(m.ProjectID, 10),
				"cluster_items": larkutil.FormatItems(clusterItems, "  ", "- "),
				"schedule_time": m.ScheduleTime.In(timeutil.ChinaTimeZone).Format("2006/01/02 15:04:05"),
				"at_user":       strings.Join(atUsers, " "),
				"detail_link":   m.DetailLink,
			},
		},
	}, nil
}

type MaintenanceTaskClosedParam struct {
	ProjectID  uint64
	DetailLink string
}

func (m MaintenanceTaskClosedParam) Message(cards MessageCardSet) (larkutil.IMMessage, error) {

	return larkutil.IMMessageCardTemplate{
		MType: "template",
		Data: larkutil.IMMessageCardTemplateData{
			ID: cards.MaintenanceTaskClosed,
			Vars: map[string]string{
				"project_id":  strconv.FormatUint(m.ProjectID, 10),
				"detail_link": m.DetailLink,
			},
		},
	}, nil
}

func (c *client) MaintenanceTaskRunning(ctx context.Context, chatID string, param MaintenanceTaskRunningParam) (*string /*message id*/, error) {
	return c.SendMessage(ctx, ReceiveTypeChat, chatID, param)
}

func (c *client) MaintenanceTaskClosed(ctx context.Context, chatID string, param MaintenanceTaskClosedParam) (*string /*message id*/, error) {
	return c.SendMessage(ctx, ReceiveTypeChat, chatID, param)
}
