package entity

import (
	"testing"

	"github.com/stretchr/testify/require"
	apiv1 "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"github.com/tidbcloud/cluster-service-ng/config"
	mysqlschema "github.com/tidbcloud/cluster-service-ng/pkg/storage/mysql/schema"
)

func TestResolveServicePlan(t *testing.T) {
	tests := []struct {
		name         string
		sharedPool   *SharedPool
		capacityMode apiv1.CapacityMode
		plan         string
		want         string
	}{
		{
			name:         "topology driven columnar is premium reserved",
			sharedPool:   &SharedPool{TiflashMode: mysqlschema.SharedPoolTiflashModeColumnar},
			capacityMode: apiv1.CapacityMode_TOPOLOGY_DRIVEN,
			plan:         PremiumServicePlan,
			want:         config.PremiumReservedMeteringPlan,
		},
		{
			name:         "explicit byoc plan wins",
			sharedPool:   &SharedPool{},
			capacityMode: apiv1.CapacityMode_RCU_DRIVEN,
			plan:         "byoc",
			want:         "byoc",
		},
		{
			name: "premium shared tiproxy is essential",
			sharedPool: &SharedPool{
				DeployType: mysqlschema.SharedPoolDeployTypeSharedTiProxy,
			},
			capacityMode: apiv1.CapacityMode_RCU_DRIVEN,
			plan:         PremiumServicePlan,
			want:         EssentialServicePlan,
		},
		{
			name:         "empty plan defaults to premium",
			sharedPool:   &SharedPool{},
			capacityMode: apiv1.CapacityMode_RCU_DRIVEN,
			plan:         "",
			want:         PremiumServicePlan,
		},
		{
			name:         "nil shared pool defaults to premium",
			sharedPool:   nil,
			capacityMode: apiv1.CapacityMode_RCU_DRIVEN,
			plan:         PremiumServicePlan,
			want:         PremiumServicePlan,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			require.Equal(t, tt.want, ResolveServicePlan(tt.sharedPool, tt.capacityMode, tt.plan))
		})
	}
}
