package resourcepool

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	clusterngv1beta "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"

	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/utilities/bizerr"
)

func TestBuildCreateSharedPoolRequestMapsTiflashMode(t *testing.T) {
	tests := []struct {
		name string
		in   globalngv1.TiflashMode
		want clusterngv1beta.TiflashMode
	}{
		{
			name: "unspecified maps to unspecified",
			in:   globalngv1.TiflashMode_TIFLASH_MODE_UNSPECIFIED,
			want: clusterngv1beta.TiflashMode_TIFLASH_MODE_UNSPECIFIED,
		},
		{
			name: "auto maps to auto",
			in:   globalngv1.TiflashMode_TIFLASH_MODE_AUTO,
			want: clusterngv1beta.TiflashMode_TIFLASH_MODE_AUTO,
		},
		{
			name: "legacy maps to legacy",
			in:   globalngv1.TiflashMode_TIFLASH_MODE_LEGACY,
			want: clusterngv1beta.TiflashMode_TIFLASH_MODE_LEGACY,
		},
		{
			name: "columnar maps to columnar",
			in:   globalngv1.TiflashMode_TIFLASH_MODE_COLUMNAR,
			want: clusterngv1beta.TiflashMode_TIFLASH_MODE_COLUMNAR,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			req := createResourcePoolRequestWithPdDeploymentMode(globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED)
			req.TiflashMode = tt.in

			sharedPoolReq, err := buildCreateSharedPoolRequest(req, 100, "cloud-identity", nil)

			require.NoError(t, err)
			assert.Equal(t, tt.want, sharedPoolReq.GetTiflashMode())
		})
	}
}

func TestBuildCreateSharedPoolRequestRejectsUnknownTiflashMode(t *testing.T) {
	req := createResourcePoolRequestWithPdDeploymentMode(globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED)
	req.TiflashMode = globalngv1.TiflashMode(999)

	_, err := buildCreateSharedPoolRequest(req, 100, "cloud-identity", nil)

	require.NotNil(t, err)
	assert.Equal(t, bizerr.ErrCodeParams, err.ErrCode())
}

func TestBuildCreateSharedPoolRequestPremiumReservedForcesColumnarTiflashMode(t *testing.T) {
	req := createResourcePoolRequestWithPdDeploymentMode(globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED)
	req.ResourcePool.ServicePlan = globalcommonv1.ServicePlan_Premium_Reserved
	req.TiflashMode = globalngv1.TiflashMode_TIFLASH_MODE_LEGACY

	sharedPoolReq, err := buildCreateSharedPoolRequest(req, 100, "cloud-identity", nil)

	require.NoError(t, err)
	assert.Equal(t, clusterngv1beta.TiflashMode_TIFLASH_MODE_COLUMNAR, sharedPoolReq.GetTiflashMode())
}
