package notify

import (
	"context"
	"strings"

	larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
	larkutil "github.com/tidbcloud/devops/pkg/infra/clients/larkcli/util"
)

type IncidentTopicParam struct {
	Name        string
	Tier        string
	Component   string
	Region      string
	OnCallers   []string
	TeamLeaders []string
	Jira        string
	Description string
}

func (p IncidentTopicParam) Message(cards MessageCardSet) (larkutil.IMMessage, error) {
	oncallerUsers := make([]string, 0, len(p.OnCallers))
	for _, onCaller := range p.OnCallers {
		oncallerUsers = append(oncallerUsers, larkutil.AtUserInCard(onCaller))
	}

	teamleaderUsers := make([]string, 0, len(p.TeamLeaders))
	for _, teamLeader := range p.TeamLeaders {
		teamleaderUsers = append(teamleaderUsers, larkutil.AtUserInCard(teamLeader))
	}

	return larkutil.IMMessageCardTemplate{
		MType: "template",
		Data: larkutil.IMMessageCardTemplateData{
			ID: cards.IncidentTopic,
			Vars: map[string]string{
				"name":        p.Name,
				"tier":        p.Tier,
				"component":   p.Component,
				"region":      p.Region,
				"jira":        p.Jira,
				"oncaller":    strings.Join(oncallerUsers, " "),
				"team_leader": strings.Join(teamleaderUsers, " "),
				"description": p.Description,
			},
		},
	}, nil
}

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

func (c *client) GetTopicReplies(ctx context.Context, chatID string, topicID string, startTime string, endTime string) ([]*larkim.Message, error) {
	messages, err := c.ListMessages(ctx, chatID, startTime, endTime)
	if err != nil {
		return nil, err
	}
	replies := make([]*larkim.Message, 0)
	for _, m := range messages.Items {
		if m.RootId == nil {
			continue
		}
		if *m.RootId == topicID {
			replies = append(replies, m)
		}
	}
	return replies, nil
}
