package server

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	apiv1 "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

func TestValidateTopologyDrivenTiDBClusterComponents(t *testing.T) {
	t.Run("required components present", func(t *testing.T) {
		spec := &apiv1.TopologySpec{
			Components: []*apiv1.Component{
				{ComponentType: apiv1.ComponentType_TIPROXY},
			},
		}

		err := validateTopologyDrivenTiDBClusterComponents(spec)
		require.NoError(t, err)
	})

	t.Run("missing required component returns invalid argument", func(t *testing.T) {
		spec := &apiv1.TopologySpec{
			Components: []*apiv1.Component{
				{ComponentType: apiv1.ComponentType_TIDB},
			},
		}

		err := validateTopologyDrivenTiDBClusterComponents(spec)
		require.Error(t, err)
		assert.Equal(t, codes.InvalidArgument, status.Code(err))
		assert.Contains(t, err.Error(), "TIPROXY")
	})

	t.Run("unsupported component returns invalid argument", func(t *testing.T) {
		spec := &apiv1.TopologySpec{
			Components: []*apiv1.Component{
				{ComponentType: apiv1.ComponentType_TIPROXY},
				{ComponentType: apiv1.ComponentType_PD},
			},
		}

		err := validateTopologyDrivenTiDBClusterComponents(spec)
		require.Error(t, err)
		assert.Equal(t, codes.InvalidArgument, status.Code(err))
		assert.Contains(t, err.Error(), "PD")
	})

	t.Run("tidb component is unsupported in cluster topology", func(t *testing.T) {
		spec := &apiv1.TopologySpec{
			Components: []*apiv1.Component{
				{ComponentType: apiv1.ComponentType_TIPROXY},
				{ComponentType: apiv1.ComponentType_TIDB},
			},
		}

		err := validateTopologyDrivenTiDBClusterComponents(spec)
		require.Error(t, err)
		assert.Equal(t, codes.InvalidArgument, status.Code(err))
		assert.Contains(t, err.Error(), "TIDB")
	})
}
