package e2e

import (
	"time"

	"github.com/stretchr/testify/suite"
	dpmgrclient "github.com/tidbcloud/infra-provider/regional-server/test/api/dataplane-manager/client"
	"github.com/tidbcloud/infra-provider/regional-server/test/api/dataplane-manager/client/data_plane_service"
	"github.com/tidbcloud/infra-provider/regional-server/test/api/dataplane-manager/models"
)

type nodePoolTestSuite struct {
	suite.Suite
	dataPlaneID     string
	dataPlaneClient *dpmgrclient.DataplaneManager
}

func newNodePoolTestSuite(dataPlaneID string, dataPlaneClient *dpmgrclient.DataplaneManager) *nodePoolTestSuite {
	return &nodePoolTestSuite{
		dataPlaneID:     dataPlaneID,
		dataPlaneClient: dataPlaneClient,
	}
}

func (s *nodePoolTestSuite) TestListNodePools() {
	listParams := &data_plane_service.DataPlaneServiceListNodePoolsParams{
		DataPlaneID: s.dataPlaneID,
	}

	var nodePools []*models.V1NodePool
	err := retryDo(s.T(), "listNodePools", func() error {
		resp, err := s.dataPlaneClient.DataPlaneService.DataPlaneServiceListNodePools(listParams)
		if err != nil {
			return err
		}
		nodePools = resp.Payload.NodePools
		return nil
	}, 3, time.Second*10)
	if !s.NoError(err) {
		return
	}

	s.Greater(len(nodePools), 0)
	for _, np := range nodePools {
		// For dedicated node pools, the following fields should be returned
		if np.NodeType == models.V1NodeTypeDedicated {
			s.NotEmpty(np.K8sVersion)
			s.NotEmpty(np.InstanceType)
			s.Greater(np.CPUCore, int64(0))
			s.Greater(np.MemoryGi, int64(0))
		}
	}
	s.True(s.nodeTypeExists(nodePools, models.V1NodeTypeDedicated))
}

func (s *nodePoolTestSuite) nodeTypeExists(nodePools []*models.V1NodePool, nodeType models.V1NodeType) bool {
	for _, nodePool := range nodePools {
		if nodePool.NodeType == nodeType {
			return true
		}
	}
	return false
}
