package resourcepool

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	clusterngv1beta "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"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"
	mockregionalserver "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/adapter/regionalserver/mock_regionalserver"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	mockcluster "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/cluster/mock_cluster"
	mockregion "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/region/mock_region"
)

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

	regionRepo := mockregion.NewMockRepo(ctrl)
	regionalCli := mockregionalserver.NewMockClient(ctrl)
	clusterRepo := mockcluster.NewMockRepo(ctrl)
	svc := &serviceImpl{
		regionRepo:  regionRepo,
		regionalCli: regionalCli,
		clusterRepo: clusterRepo,
	}

	rp := &entity.ResourcePool{
		ResourcePool: &globalngv1.ResourcePool{
			Id:          100,
			ProviderId:  globalcommonv1.CloudProvider_AWS,
			RegionId:    globalcommonv1.Region_AWS_US_EAST_1,
			OwnerType:   globalngv1.ResourcePool_ORGANIZATION,
			OwnerId:     42,
			ServicePlan: globalcommonv1.ServicePlan_Premium_Reserved,
		},
		RegionId:        10,
		CloudProviderId: 20,
	}
	region := &entity.Region{
		Region: &globalcommonv1.Region{
			Id: globalcommonv1.Region_AWS_US_EAST_1,
		},
		RegionID:   10,
		ProviderID: 20,
	}

	regionRepo.EXPECT().Get(gomock.Any(), rp.RegionId).Return(region, nil)
	regionalCli.EXPECT().GetSharedPool(
		gomock.Any(),
		region,
		&clusterngv1beta.GetSharedPoolRequest{SharedPoolId: "100"},
	).Return(&clusterngv1beta.SharedPool{
		Id: "100",
		EnabledTikvRemoteWorkers: []clusterngv1beta.ComponentType{
			clusterngv1beta.ComponentType_TIKV_WORKER,
			clusterngv1beta.ComponentType_COPROCESSOR_WORKER,
		},
		PdDeploymentMode: clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_MONOLITHIC,
	}, nil)
	clusterRepo.EXPECT().Query(gomock.Any(), gomock.Any()).Return([]*entity.Cluster{}, nil)

	got, err := svc.fullResourcePoolProfile(t.Context(), rp)

	require.NoError(t, err)
	assert.Equal(t, globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_MONOLITHIC, got.GetPdDeploymentMode())
	assert.Equal(t, []globalngv1.ComponentType{
		globalngv1.ComponentType_TIKV_WORKER,
		globalngv1.ComponentType_COPROCESSOR_WORKER,
	}, got.GetEnabledTikvRemoteWorkers())
}
