package resourcemanager

import (
	"context"
	"testing"

	"github.com/stretchr/testify/assert"
	v1 "github.com/tidbcloud/observability/api/regionalserver/resourceworker/v1"
	"github.com/tidbcloud/observability/pkg/common/constants"
	"github.com/tidbcloud/observability/pkg/common/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func Test_objectStorageReaderWriter(t *testing.T) {
	// disturbance term
	disturbance := &v1.S3{
		ObjectMeta: metav1.ObjectMeta{
			Name:      "disturbance",
			Namespace: constants.ObservabilityNamespace,
		},
		Spec: v1.S3Spec{
			Name: "disturbance",
		},
	}
	err := objectStorageRW.CreateObjectStorage(context.TODO(), disturbance)

	assert.NoError(t, err)
	defer objectStorageRW.(objectStorageReaderWriter).cli.Delete(context.TODO(), disturbance)

	defaultS3Name := "s3111"
	defaultS3 := &v1.S3{
		ObjectMeta: metav1.ObjectMeta{
			Name:      defaultS3Name,
			Namespace: constants.ObservabilityNamespace,
		},
		Spec: v1.S3Spec{
			Name: defaultS3Name,
		},
	}
	exists, err := objectStorageRW.IsObjectStorageExisted(context.TODO(), defaultS3Name)
	assert.NoError(t, err)
	assert.False(t, exists)

	err = objectStorageRW.CreateObjectStorage(context.TODO(), defaultS3)
	assert.NoError(t, err)

	// conflict
	err = objectStorageRW.CreateObjectStorage(context.TODO(), &v1.S3{
		ObjectMeta: metav1.ObjectMeta{
			Name:      defaultS3Name,
			Namespace: constants.ObservabilityNamespace,
		},
		Spec: v1.S3Spec{
			Name: defaultS3Name,
		},
	})
	assert.Error(t, err)
	assert.Equal(t, errors.DuplicatedBucketName, err.(errors.Error).Code())

	exists, err = objectStorageRW.IsObjectStorageExisted(context.TODO(), defaultS3Name)
	assert.NoError(t, err)
	assert.True(t, exists)

	result, err := objectStorageRW.GetObjectStorage(context.TODO(), defaultS3Name)
	assert.NoError(t, err)
	assert.Equal(t, defaultS3Name, result.Spec.Name)

	result, err = objectStorageRW.GetObjectStorage(context.TODO(), "notfound")
	assert.Error(t, err)
	assert.Equal(t, errors.BucketNotFound, err.(errors.Error).Code())
}
