package larkcli

import (
	"fmt"

	"github.com/tidbcloud/escalation-base/feishu_messager_v2/pkg/infra/clients/larkcli/contact"
	"github.com/tidbcloud/escalation-base/feishu_messager_v2/pkg/infra/clients/larkcli/message"

	lark "github.com/larksuite/oapi-sdk-go/v3"
)

type LarkClient struct {
	Raw     *lark.Client
	Message message.Message
	Contact contact.Contact
}

func NewClient(appCode string, appSecret string) *LarkClient {
	raw := lark.NewClient(appCode, appSecret)
	client := &LarkClient{
		Raw:     raw,
		Message: message.New(raw),
		Contact: contact.New(raw),
	}

	return client
}

type LarkClientParam struct {
	ClientKey string
	AppCode   string
	AppSecret string
}

type LarkClientSet struct {
	Clients map[string]*LarkClient
}

func (ls *LarkClientSet) GetClient(clientTag string) (*LarkClient, error) {
	cli, ok := ls.Clients[clientTag]
	if ok {
		return cli, nil
	} else {
		return nil, fmt.Errorf("client not found")
	}
}

func NewClientSet(params []LarkClientParam) (*LarkClientSet, error) {
	clientSet := &LarkClientSet{Clients: make(map[string]*LarkClient)}
	for _, param := range params {
		clientSet.Clients[param.ClientKey] = NewClient(param.AppCode, param.AppSecret)
	}

	return clientSet, nil
}
