package nodegroup

import (
	"testing"

	"github.com/stretchr/testify/assert"
	dplanemgrv1 "github.com/tidbcloud/cluster-service-ng/api/dataplane-manager/v1"
)

func TestNodePoolMatchesRole(t *testing.T) {
	tests := []struct {
		name     string
		pool     *dplanemgrv1.NodePool
		role     NodePoolRole
		expected bool
	}{
		{
			name: "managed primary by priority",
			pool: &dplanemgrv1.NodePool{Labels: map[string]string{
				LabelManagedBy: ManagedByInstanceTypeManager,
				LabelPriority:  "1000",
			}},
			role:     NodePoolRolePrimary,
			expected: true,
		},
		{
			name: "managed fallback by priority",
			pool: &dplanemgrv1.NodePool{Labels: map[string]string{
				LabelManagedBy: ManagedByInstanceTypeManager,
				LabelPriority:  "100",
			}},
			role:     NodePoolRoleFallback,
			expected: true,
		},
		{
			name: "managed fallback does not match primary",
			pool: &dplanemgrv1.NodePool{Labels: map[string]string{
				LabelManagedBy: ManagedByInstanceTypeManager,
				LabelPriority:  "100",
			}},
			role:     NodePoolRolePrimary,
			expected: false,
		},
		{
			name:     "managed primary by name prefix",
			pool:     &dplanemgrv1.NodePool{Name: "primary-m5-xlarge", Labels: map[string]string{LabelManagedBy: ManagedByInstanceTypeManager}},
			role:     NodePoolRolePrimary,
			expected: true,
		},
		{
			name:     "managed fallback by name prefix",
			pool:     &dplanemgrv1.NodePool{Name: "fallback-m5-xlarge", Labels: map[string]string{LabelManagedBy: ManagedByInstanceTypeManager}},
			role:     NodePoolRoleFallback,
			expected: true,
		},
		{
			name:     "legacy managed pool without role metadata matches for compatibility",
			pool:     &dplanemgrv1.NodePool{Name: "legacy-pool", Labels: map[string]string{LabelManagedBy: ManagedByInstanceTypeManager}},
			role:     NodePoolRolePrimary,
			expected: true,
		},
		{
			name:     "dataplane default pool only matches primary",
			pool:     &dplanemgrv1.NodePool{},
			role:     NodePoolRolePrimary,
			expected: true,
		},
		{
			name:     "dataplane default pool does not match fallback",
			pool:     &dplanemgrv1.NodePool{},
			role:     NodePoolRoleFallback,
			expected: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			assert.Equal(t, tt.expected, NodePoolMatchesRole(tt.pool, tt.role))
		})
	}
}
