package providers

import (
	"os"
	"testing"

	"github.com/stretchr/testify/assert"
	"go.uber.org/mock/gomock"

	"github.com/tidbcloud/observability/pkg/common/constants"
	"github.com/tidbcloud/observability/pkg/common/structs"
	mockproviders "github.com/tidbcloud/observability/test/mockresourceworker/providers"
)

func TestGetClient(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()
	os.Setenv("AWS_ACCESS_KEY_ID", "test1")
	os.Setenv("AWS_SECRET_ACCESS_KEY", "testsec")
	os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "../../../test/files/application_default_credentials.json")
	defer os.Unsetenv("GOOGLE_APPLICATION_CREDENTIALS")
	defer os.Unsetenv("AWS_SECRET_ACCESS_KEY")
	defer os.Unsetenv("AWS_ACCESS_KEY_ID")
	os.Setenv("ALIBABA_CLOUD_ACCESS_KEY_ID", "test1")
	os.Setenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "testsec")
	defer os.Unsetenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
	defer os.Unsetenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")

	t.Run("init aws client", func(t *testing.T) {
		InitClient(structs.ServiceInfo{
			Vendor: string(constants.AWS),
		})
	})

	t.Run("init gcp client", func(t *testing.T) {
		InitClient(structs.ServiceInfo{
			Vendor: string(constants.GCP),
		})
	})

	t.Run("init ali client", func(t *testing.T) {
		InitClient(structs.ServiceInfo{
			Vendor: string(constants.AliCloud),
		})
	})

	mockAWSIAMClient := mockproviders.NewMockIAMClient(ctrl)
	MockAWSIAMClient(mockAWSIAMClient)
	mockGCPIAMClient := mockproviders.NewMockIAMClientGCP(ctrl)
	MockGCPIAMClient(mockGCPIAMClient)
	mockAliCloudClient := mockproviders.NewMockIAMClientAliCloud(ctrl)
	MockAliCloudIAMClient(mockAliCloudClient)

	MockAWSPrivateEndpointClient(mockproviders.NewMockPrivateEndpointClient(ctrl))
	MockGCPPSCClient(mockproviders.NewMockPSCClient(ctrl))

	awsIAMClient := GetAWSIAMClient()
	assert.NotNil(t, awsIAMClient)
	assert.NotNil(t, GetAWSPrivateEndpointClient())

	gcpIAMClient := GetGCPIAMClient()
	assert.NotNil(t, gcpIAMClient)
	assert.NotNil(t, GetGCPPSCClient())

	aliClient := GetAliCloudIAMClient()
	assert.NotNil(t, aliClient)
}
