package action

import (
	"context"
	"testing"

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

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/adapter/regionserver/mock_regionserver"
	clusterentity "github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
	regionmock "github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/repository/region/mock_region"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

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

	mockRegionalCli := mock_regionserver.NewMockClient(ctrl)
	mockRegionRepo := regionmock.NewMockRepo(ctrl)

	cluster := &clusterentity.Cluster{
		Cluster: &globaldedicatedv1.Cluster{
			ClusterId:       12345,
			OrganizationId:  60205,
			CloudProviderId: globalcommonv1.CloudProvider_GCP,
			RegionId:        globalcommonv1.Region_GCP_US_WEST1,
		},
	}

	mockRegionRepo.EXPECT().SelectRegionById(gomock.Any(), globalcommonv1.Region_GCP_US_WEST1, uint64(60205)).Return(
		&globalcommonv1.Region{Id: globalcommonv1.Region_GCP_US_WEST1, State: globalcommonv1.Region_ACTIVE}, nil,
	)

	notFound := bizerr.New(bizerr.ErrCodeRecordNotFound, "not found")

	mockRegionalCli.EXPECT().DeleteCluster(gomock.Any(), gomock.Any(), gomock.Any()).Return(notFound)

	a := &DeleteClusterAction{
		regionalCli: mockRegionalCli,
		regionRepo:  mockRegionRepo,
	}

	err := a.deleteResources(context.Background(), cluster)
	require.NoError(t, err)
}

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

	mockRegionalCli := mock_regionserver.NewMockClient(ctrl)
	mockRegionRepo := regionmock.NewMockRepo(ctrl)

	cluster := &clusterentity.Cluster{
		Cluster: &globaldedicatedv1.Cluster{
			ClusterId:       12345,
			OrganizationId:  60205,
			CloudProviderId: globalcommonv1.CloudProvider_AWS,
			RegionId:        globalcommonv1.Region_AWS_US_WEST_2,
		},
	}

	mockRegionRepo.EXPECT().SelectRegionById(gomock.Any(), globalcommonv1.Region_AWS_US_WEST_2, uint64(60205)).Return(
		&globalcommonv1.Region{Id: globalcommonv1.Region_AWS_US_WEST_2, State: globalcommonv1.Region_ACTIVE}, nil,
	)

	mockRegionalCli.EXPECT().DeleteCluster(gomock.Any(), gomock.Any(), gomock.Any()).Return(
		bizerr.New(bizerr.ErrCodeRecordNotFound, "not found"),
	)

	a := &DeleteClusterAction{
		regionalCli: mockRegionalCli,
		regionRepo:  mockRegionRepo,
	}

	err := a.deleteResources(context.Background(), cluster)
	require.NoError(t, err)
}
