package resourcepool

import (
	"context"
	"testing"

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

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	reporesourcepool "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/resourcepool"
	mockresourcepool "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/resourcepool/mock_resourcepool"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func TestShouldManageResourcePoolStrategy(t *testing.T) {
	assert.False(t, shouldManageResourcePoolStrategy(globalcommonv1.ServicePlan_Premium_Reserved))
	assert.True(t, shouldManageResourcePoolStrategy(globalcommonv1.ServicePlan_Premium))
	assert.True(t, shouldManageResourcePoolStrategy(globalcommonv1.ServicePlan_BYOC))
}

func TestListOwnerResourcePools_PremiumReservedReturnsNoStrategies(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	repo := mockresourcepool.NewMockRepo(ctrl)
	strategyRepo := mockresourcepool.NewMockStrategyRepo(ctrl)

	s := &serviceImpl{
		resourcePoolRepo:         repo,
		resourcePoolStrategyRepo: strategyRepo,
	}

	repo.EXPECT().Query(gomock.Any(), gomock.Any()).DoAndReturn(
		func(_ context.Context, filter *reporesourcepool.Filter) ([]*entity.ResourcePool, int64, bizerr.BizError) {
			assert.Equal(t, []globalcommonv1.ServicePlan{globalcommonv1.ServicePlan_Premium_Reserved}, filter.ServicePlans)
			return []*entity.ResourcePool{}, 0, nil
		},
	)

	profiles, strategies, err := s.ListOwnerResourcePools(t.Context(), &globalngv1.ListOwnerResourcePoolsRequest{
		OwnerType:   globalngv1.ResourcePool_ORGANIZATION,
		OwnerId:     100,
		ServicePlan: globalcommonv1.ServicePlan_Premium_Reserved,
	})

	require.Nil(t, err)
	assert.Empty(t, profiles)
	assert.Empty(t, strategies)
}
