package resourcemanager

import (
	"context"
	"fmt"
	"testing"

	"github.com/tidbcloud/observability/pkg/common/constants"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	"github.com/stretchr/testify/assert"
	v1 "k8s.io/api/core/v1"
)

func Test_namespaceReaderWriter(t *testing.T) {
	bizType := "cloud"
	tenant := "tenant1"
	name := fmt.Sprintf("%s-%s", bizType, tenant)
	existed, err := namespaceRW.IsNamespaceExisted(context.TODO(), name)
	assert.NoError(t, err)
	assert.False(t, existed)

	_, err = namespaceRW.Get(context.TODO(), name)
	assert.NoError(t, err)

	err = namespaceRW.Create(context.TODO(), &v1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name: name,
			Labels: map[string]string{
				constants.LabelBizType:  bizType,
				constants.LabelTenantID: tenant,
			},
		},
	})
	assert.NoError(t, err)

	ns, err := namespaceRW.Get(context.TODO(), name)
	assert.NoError(t, err)
	assert.Equal(t, name, ns.Name)

	ns.Labels["aaa"] = "aaa"

	err = namespaceRW.Update(context.TODO(), ns)
	assert.NoError(t, err)

	// duplicated
	err = namespaceRW.Create(context.TODO(), &v1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name: name,
		},
	})
	assert.Error(t, err)

	err = namespaceRW.CreateServiceAccount(context.TODO(), name, "arn")
	assert.NoError(t, err)

	err = namespaceRW.CreateServiceAccount(context.TODO(), name, "arn")
	assert.Error(t, err)

	existed, err = namespaceRW.IsNamespaceExisted(context.TODO(), name)
	assert.NoError(t, err)
	assert.True(t, existed)

	existed, err = namespaceRW.IsNamespaceExisted(context.TODO(), "whatever")
	assert.NoError(t, err)
	assert.False(t, existed)
}
