package v1alpha1

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestEffectiveDataPlaneOwnershipMode(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name    string
		stored  DataPlaneOwnershipMode
		want    DataPlaneOwnershipMode
		wantErr string
	}{
		{name: "old dataplane defaults to single pool", want: DataPlaneOwnershipModeSinglePool},
		{name: "single pool", stored: DataPlaneOwnershipModeSinglePool, want: DataPlaneOwnershipModeSinglePool},
		{name: "multi pool", stored: DataPlaneOwnershipModeMultiPool, want: DataPlaneOwnershipModeMultiPool},
		{name: "unknown fails closed", stored: "FutureOwnership", wantErr: "unknown stored dataplane ownership mode"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()
			got, err := EffectiveDataPlaneOwnershipMode(tt.stored)
			if tt.wantErr != "" {
				require.ErrorContains(t, err, tt.wantErr)
				assert.Empty(t, got)
				return
			}
			require.NoError(t, err)
			assert.Equal(t, tt.want, got)
		})
	}
}

func TestValidateDataPlaneOwnershipModeUpdate(t *testing.T) {
	t.Parallel()

	for _, tt := range []struct {
		name    string
		oldMode DataPlaneOwnershipMode
		newMode DataPlaneOwnershipMode
		wantErr bool
	}{
		{name: "old absent stays absent"},
		{name: "single stays single", oldMode: DataPlaneOwnershipModeSinglePool, newMode: DataPlaneOwnershipModeSinglePool},
		{name: "multi stays multi", oldMode: DataPlaneOwnershipModeMultiPool, newMode: DataPlaneOwnershipModeMultiPool},
		{name: "old absent cannot be backfilled", newMode: DataPlaneOwnershipModeSinglePool, wantErr: true},
		{name: "single cannot promote", oldMode: DataPlaneOwnershipModeSinglePool, newMode: DataPlaneOwnershipModeMultiPool, wantErr: true},
		{name: "multi cannot demote", oldMode: DataPlaneOwnershipModeMultiPool, newMode: DataPlaneOwnershipModeSinglePool, wantErr: true},
	} {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()
			err := ValidateDataPlaneOwnershipModeUpdate(tt.oldMode, tt.newMode)
			if tt.wantErr {
				require.ErrorContains(t, err, "immutable")
				return
			}
			require.NoError(t, err)
		})
	}
}
