package cluster

import (
	"testing"

	"github.com/onsi/gomega"
	"github.com/samber/lo"

	bffclusterv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/bff/cluster_management/v1beta1"
	openapidedicatedv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/dedicated/v1beta1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/app/bff/orchestrator"
)

func TestAdvancedModifySetValidateOnly(t *testing.T) {
	g := gomega.NewWithT(t)

	t.Run("test", func(t *testing.T) {
		req := &bffclusterv1beta1.AdvancedModifyDedicatedClusterRequest{
			Cluster: &bffclusterv1beta1.AdvancedModifyDedicatedClusterRequest_Cluster{
				TidbNodeSetting: &bffclusterv1beta1.AdvancedModifyDedicatedClusterRequest_TidbNodeSetting{
					CreateTidbNodeGroups: []*bffclusterv1beta1.AdvancedModifyDedicatedClusterRequest_TidbNodeGroupCreate{
						{
							NodeCount: 1,
						},
					},
					UpdateTidbNodeGroups: []*bffclusterv1beta1.AdvancedModifyDedicatedClusterRequest_TidbNodeGroupUpdate{
						{
							TidbNodeGroupId: "1",
							NodeCount:       1,
						},
					},
					DeleteTidbNodeGroupIds: []string{
						"2",
					},
				},
				TikvNodeSetting: &openapidedicatedv1beta1.UpdateClusterRequest_StorageNodeSetting{
					NodeCount: lo.ToPtr(int32(3)),
				},
			},
		}

		newRequests := advancedRequestTransform(req)
		lo.ForEach(newRequests, func(item *orchestrator.OpenAPIRequest, index int) {
			switch item.ActionName {
			case OpenAPICreateTiDBGroupAction:
				_, ok := item.Message.(*openapidedicatedv1beta1.CreateTidbNodeGroupRequest)
				g.Expect(ok).Should(gomega.BeTrue())
			case OpenAPIUpdateTiDBGroupAction:
				_, ok := item.Message.(*openapidedicatedv1beta1.UpdateTidbNodeGroupRequest)
				g.Expect(ok).Should(gomega.BeTrue())
			case OpenAPIDeleteTiDBGroupAction:
				_, ok := item.Message.(*openapidedicatedv1beta1.DeleteTidbNodeGroupRequest)
				g.Expect(ok).Should(gomega.BeTrue())
			case OpenAPIScaleAction:
				_, ok := item.Message.(*openapidedicatedv1beta1.UpdateClusterRequest)
				g.Expect(ok).Should(gomega.BeTrue())
			}
		})
	})
}
