//go:generate ${GOBIN}/dummygen -d=client_dummy.go -package=aliyuncli ${GO_MODULE}/pkg/infra/clients/aliyuncli AliyunClient
package aliyuncli

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	kms "github.com/alibabacloud-go/kms-20160120/v3/client"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	osscred "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	credential "github.com/aliyun/credentials-go/credentials"

	"github.com/tidbcloud/devops/pkg/infra/config"
)

type AliyunClient interface {
	OSS() *oss.Client
	KMS() *kms.Client
}

type aliyunClient struct {
	oss *oss.Client
	kms *kms.Client
}

func NewAliyunClient(conf *config.RootConfig) (AliyunClient, error) {
	if conf.Clients.Aliyun.Dummy {
		return &DummyAliyunClient{}, nil
	}

	var err error
	cli := &aliyunClient{}

	cred, err := credential.NewCredential(nil)
	if err != nil {
		return nil, err
	}

	aliConfig := &openapi.Config{
		Credential: cred,
	}

	cli.oss = oss.NewClient(oss.LoadDefaultConfig().WithCredentialsProvider(osscred.NewEcsRoleCredentialsProvider()))
	cli.kms, err = kms.NewClient(aliConfig)
	if err != nil {
		return nil, err
	}

	return cli, nil
}

func (c *aliyunClient) OSS() *oss.Client {
	return c.oss
}

func (c *aliyunClient) KMS() *kms.Client {
	return c.kms
}
