package handler

import (
	"testing"

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

func TestCopiesNumberPicker(t *testing.T) {
	var locationConstraints = map[string][]uint32{}
	locationConstraint1 := "one"
	locationConstraint2 := "two"
	locationConstraints[locationConstraint1] = []uint32{2, 3, 4}

	config := &configMock{
		copiesNumbers:        locationConstraints,
		defaultCopiesNumbers: []uint32{1},
	}
	h := handler{
		cfg: config,
	}

	metadata := map[string]string{}

	t.Run("pick default copies number", func(t *testing.T) {
		metadata["somekey1"] = "5, 6, 7"
		expectedCopiesNumbers := []uint32{1}

		actualCopiesNumbers, err := h.pickCopiesNumbers(metadata, "", locationConstraint2)
		require.NoError(t, err)
		require.Equal(t, expectedCopiesNumbers, actualCopiesNumbers)
	})

	t.Run("pick copies number vector according to location constraint", func(t *testing.T) {
		metadata["somekey2"] = "6, 7, 8"
		expectedCopiesNumbers := []uint32{2, 3, 4}

		actualCopiesNumbers, err := h.pickCopiesNumbers(metadata, "", locationConstraint1)
		require.NoError(t, err)
		require.Equal(t, expectedCopiesNumbers, actualCopiesNumbers)
	})

	t.Run("pick copies number from metadata", func(t *testing.T) {
		metadata["frostfs-copies-number"] = "7, 8, 9"
		expectedCopiesNumbers := []uint32{7, 8, 9}

		actualCopiesNumbers, err := h.pickCopiesNumbers(metadata, "", locationConstraint2)
		require.NoError(t, err)
		require.Equal(t, expectedCopiesNumbers, actualCopiesNumbers)
	})

	t.Run("pick copies number from metadata with no space", func(t *testing.T) {
		metadata["frostfs-copies-number"] = "7,8,9"
		expectedCopiesNumbers := []uint32{7, 8, 9}

		actualCopiesNumbers, err := h.pickCopiesNumbers(metadata, "", locationConstraint2)
		require.NoError(t, err)
		require.Equal(t, expectedCopiesNumbers, actualCopiesNumbers)
	})

	t.Run("pick copies number from metadata with trailing comma", func(t *testing.T) {
		metadata["frostfs-copies-number"] = "11, 12, 13, "
		expectedCopiesNumbers := []uint32{11, 12, 13}

		actualCopiesNumbers, err := h.pickCopiesNumbers(metadata, "", locationConstraint2)
		require.NoError(t, err)
		require.Equal(t, expectedCopiesNumbers, actualCopiesNumbers)
	})
}