package publicconnectionsetting

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	dataplanemanagerv1 "github.com/tidbcloud/cluster-service-ng/api/tidbcloud/dataplane-manager/v1"
	"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/adapter/regionalserver/mock_regionalserver"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/region/mock_region"
)

func TestFullEgressIPs(t *testing.T) {
	ctrl := gomock.NewController(t)
	regionRepo := mock_region.NewMockRepo(ctrl)
	regionalCli := mock_regionalserver.NewMockClient(ctrl)
	svc := &serviceImpl{
		regionRepo:  regionRepo,
		regionalCli: regionalCli,
	}
	cluster := &entity.Cluster{
		Cluster:  &globalngv1.Cluster{DataplaneId: "dp-1"},
		RegionId: 2001,
	}
	enabled := true
	setting := &entity.PublicConnectionSetting{PublicConnectionSetting: &globalngv1.PublicConnectionSetting{ClusterId: 1001, Enable: &enabled}}
	region := &entity.Region{RegionID: 2001, Region: &globalcommonv1.Region{}}

	regionRepo.EXPECT().ListRegions(gomock.Any(), gomock.Any()).Return([]*entity.Region{region}, nil)
	regionalCli.EXPECT().GetDataPlane(gomock.Any(), region, &dataplanemanagerv1.GetDataPlaneRequest{
		DataPlaneId: "dp-1",
	}).Return(&dataplanemanagerv1.DataPlane{
		Vpc: &dataplanemanagerv1.DataPlane_Vpc{NatIps: []string{"1.1.1.1", "2.2.2.2"}},
	}, nil)

	err := svc.fullEgressIPs(t.Context(), cluster, setting)

	require.Nil(t, err)
	assert.Equal(t, []string{"1.1.1.1", "2.2.2.2"}, setting.GetEgressIps())
}

func TestFullEgressIPsSkipsDisabledPublicConnection(t *testing.T) {
	ctrl := gomock.NewController(t)
	regionRepo := mock_region.NewMockRepo(ctrl)
	regionalCli := mock_regionalserver.NewMockClient(ctrl)
	svc := &serviceImpl{
		regionRepo:  regionRepo,
		regionalCli: regionalCli,
	}
	disabled := false
	cluster := &entity.Cluster{
		Cluster:  &globalngv1.Cluster{DataplaneId: "dp-1"},
		RegionId: 2001,
	}
	setting := &entity.PublicConnectionSetting{PublicConnectionSetting: &globalngv1.PublicConnectionSetting{ClusterId: 1001, Enable: &disabled}}

	err := svc.fullEgressIPs(t.Context(), cluster, setting)

	require.Nil(t, err)
	assert.Nil(t, setting.GetEgressIps())
}
