package gkeheterogeneous

import (
	"testing"

	"github.com/stretchr/testify/require"
	regionaldedicatedv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	"go.uber.org/mock/gomock"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/adapter/regionserver/mock_regionserver"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

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

	region := &globalcommonv1.Region{Id: globalcommonv1.Region_GCP_US_WEST1}
	mockCli := mock_regionserver.NewMockClient(ctrl)
	mockCli.EXPECT().GetGKEHeterogeneousDeploy(gomock.Any(), region, gomock.Any()).Return(nil, nil)

	_, _, berr := GetDeploy(t.Context(), mockCli, region, "12345", regionaldedicatedv1.ComponentType_TIKV, "")
	require.NotNil(t, berr)
	require.Equal(t, bizerr.ErrCodeRegionalAPI, berr.ErrCode())
}

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

	region := &globalcommonv1.Region{Id: globalcommonv1.Region_GCP_US_WEST1}
	mockCli := mock_regionserver.NewMockClient(ctrl)
	mockCli.EXPECT().GetGKEHeterogeneousDeploy(gomock.Any(), region, gomock.Any()).Return(
		nil, bizerr.New(bizerr.ErrCodeRecordNotFound, "not found"),
	)

	deploy, exists, berr := GetDeploy(t.Context(), mockCli, region, "12345", regionaldedicatedv1.ComponentType_TIKV, "")
	require.Nil(t, berr)
	require.False(t, exists)
	require.NotNil(t, deploy)
	require.False(t, deploy.GetEnabled())
}

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

	region := &globalcommonv1.Region{Id: globalcommonv1.Region_GCP_US_WEST1}
	mockCli := mock_regionserver.NewMockClient(ctrl)
	mockCli.EXPECT().GetGKEHeterogeneousDeploy(gomock.Any(), region, gomock.Any()).Return(
		&regionaldedicatedv1.GKEHeterogeneousDeploy{Enabled: false}, nil,
	)

	deploy, exists, berr := GetDeploy(t.Context(), mockCli, region, "12345", regionaldedicatedv1.ComponentType_TIDB, "100")
	require.Nil(t, berr)
	require.False(t, exists)
	require.NotNil(t, deploy)
	require.False(t, deploy.GetEnabled())
}
