package ownership

import (
	"testing"

	"github.com/stretchr/testify/require"
	regionalapiv1 "github.com/tidbcloud/cluster-service-ng/api/tidbcloud/dataplane-manager/v1"
	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	bizerr "github.com/tidbcloud/infra-provider/regional-server/pkg/common/errors"
)

func TestMatch(t *testing.T) {
	tests := []struct {
		name    string
		request *regionalapiv1.ResourceOwnershipContext
		current *v1alpha1.ResourceOwnership
		wantErr bool
	}{
		{name: "ownerless current without request"},
		{name: "ownerless current with request", request: &regionalapiv1.ResourceOwnershipContext{SharedPoolId: "sp-1"}},
		{name: "empty current owner without request", current: &v1alpha1.ResourceOwnership{}},
		{name: "empty current owner with request", request: &regionalapiv1.ResourceOwnershipContext{SharedPoolId: "sp-1"}, current: &v1alpha1.ResourceOwnership{}},
		{name: "matching owner", request: &regionalapiv1.ResourceOwnershipContext{SharedPoolId: "sp-1"}, current: &v1alpha1.ResourceOwnership{SharedPoolID: "sp-1"}},
		{name: "missing request owner", current: &v1alpha1.ResourceOwnership{SharedPoolID: "sp-1"}, wantErr: true},
		{name: "different request owner", request: &regionalapiv1.ResourceOwnershipContext{SharedPoolId: "sp-2"}, current: &v1alpha1.ResourceOwnership{SharedPoolID: "sp-1"}, wantErr: true},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			err := Match(test.request, test.current)
			if test.wantErr {
				require.True(t, bizerr.Is(err, bizerr.ResourceConflict))
				return
			}
			require.NoError(t, err)
		})
	}
}

func TestFromRequest(t *testing.T) {
	require.Nil(t, FromRequest(nil))
	require.Nil(t, FromRequest(&regionalapiv1.ResourceOwnershipContext{}))
	require.Equal(t, &v1alpha1.ResourceOwnership{SharedPoolID: "sp-1"}, FromRequest(&regionalapiv1.ResourceOwnershipContext{SharedPoolId: "sp-1"}))
}
