package resourcemanager

import (
	"context"
	errors2 "errors"
	"os"
	"testing"

	"github.com/tidbcloud/observability/pkg/common/configs"
	"github.com/tidbcloud/observability/pkg/common/errors"
	"github.com/tidbcloud/observability/pkg/common/structs"

	"github.com/stretchr/testify/assert"
)

func TestGetReaderWriter(t *testing.T) {
	cluster := GetClusterReaderWriter(context.TODO())
	assert.NotNil(t, cluster)
	obj := GetObjectStorageReaderWriter(context.TODO())
	assert.NotNil(t, obj)
	iam := GetIAMReaderWriter(context.TODO())
	assert.NotNil(t, iam)
	ns := GetNamespaceReaderWriter()
	assert.NotNil(t, ns)
	da := GetDataAccountReaderWriter()
	assert.NotNil(t, da)
	pa := GetPrometheusRulesReaderWriter(context.TODO(), false)
	assert.NotNil(t, pa)
	pvc := GetPVCReaderWriter()
	assert.NotNil(t, pvc)
	crb := GetClusterRoleBindingReaderWriter(context.TODO())
	assert.NotNil(t, crb)
	job := GetJobReaderWriter()
	assert.NotNil(t, job)
	promCli := GetPrometheusAPIClient()
	assert.NotNil(t, promCli)
	GetPrometheusOperatorClient()
	MockClusterReaderWriter(cluster)
	MockObjectStorageReaderWriter(obj)
	MockIAMReaderWriter(iam)
	MockNamespaceReaderWriter(ns)
	MockDataAccountReaderWriter(da)
	MockPrometheusRuleReaderWriter(pa)
	MockPVCReaderWriter(pvc)
	MockClusterRoleBindingReaderWriter(crb)
	MockJobReaderWriter(job)
	MockPrometheusAPIClient(promCli)
}

func TestWrapClientError(t *testing.T) {
	err := WrapClientError(nil)
	assert.NoError(t, err)

	err = WrapClientError(errors.New(errors.AWSClientError, ""))
	assert.Error(t, err)
	assert.Equal(t, err.(errors.Error).Code(), errors.AWSClientError)

	err = WrapClientError(errors2.New(""))
	assert.Error(t, err)
	assert.Equal(t, err.(errors.Error).Code(), errors.K8SClientError)

}

func Test_GetClusterRoleBindingReaderWriter(t *testing.T) {
	clusterRoleBinding := GetClusterRoleBindingReaderWriter(context.TODO())
	assert.NotNil(t, clusterRoleBinding)
}

func Test_getS3Client(t *testing.T) {
	bakckup := configs.GetServiceInfo()
	defer configs.Init(bakckup)
	configs.Init(structs.ServiceInfo{
		Vendor: "aws",
		Region: "us-east-1",
	})
	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")
	os.Setenv("ALIBABA_CLOUD_ACCESS_KEY_ID", "test1")
	os.Setenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "testsec")
	defer os.Unsetenv("GOOGLE_APPLICATION_CREDENTIALS")
	defer os.Unsetenv("AWS_SECRET_ACCESS_KEY")
	defer os.Unsetenv("AWS_ACCESS_KEY_ID")
	defer os.Unsetenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
	defer os.Unsetenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
	//aws
	s3Client, err := getS3Client()
	assert.NoError(t, err)
	assert.NotNil(t, s3Client)
	//gcp
	configs.Init(structs.ServiceInfo{
		Vendor: "gcp",
		AccountInfo: structs.AccountInfoConfig{
			Project: "test",
		},
		Region: "us-central1",
	})
	s3Client, err = getS3Client()
	assert.NoError(t, err)
	assert.NotNil(t, s3Client)
	//alicloud
	configs.Init(structs.ServiceInfo{
		Vendor: "alicloud",
		Region: "us-west-2",
	})
	s3Client, err = getS3Client()
	assert.NoError(t, err)
	assert.NotNil(t, s3Client)
	//azure
	configs.Init(structs.ServiceInfo{
		Vendor: "azure",
		Region: "eastus",
		AccountInfo: structs.AccountInfoConfig{
			SubscriptionID: "test",
			ResourceGroup:  "test",
			StorageAccount: "test",
		},
	})
	s3Client, err = getS3Client()
	assert.NoError(t, err)
	assert.NotNil(t, s3Client)
}
