package encoding

import (
	"testing"

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

type decoder struct {
	v map[string]any
}

func (d decoder) Decode(_ []byte, v map[string]any) error {
	for key, value := range d.v {
		v[key] = value
	}

	return nil
}

func TestDecoderRegistry_RegisterDecoder(t *testing.T) {
	t.Run("OK", func(t *testing.T) {
		registry := NewDecoderRegistry()

		err := registry.RegisterDecoder("myformat", decoder{})
		require.NoError(t, err)
	})

	t.Run("AlreadyRegistered", func(t *testing.T) {
		registry := NewDecoderRegistry()

		err := registry.RegisterDecoder("myformat", decoder{})
		require.NoError(t, err)

		err = registry.RegisterDecoder("myformat", decoder{})
		assert.ErrorIs(t, err, ErrDecoderFormatAlreadyRegistered)
	})
}

func TestDecoderRegistry_Decode(t *testing.T) {
	t.Run("OK", func(t *testing.T) {
		registry := NewDecoderRegistry()
		decoder := decoder{
			v: map[string]any{
				"key": "value",
			},
		}

		err := registry.RegisterDecoder("myformat", decoder)
		require.NoError(t, err)

		v := map[string]any{}

		err = registry.Decode("myformat", []byte("key: value"), v)
		require.NoError(t, err)

		assert.Equal(t, decoder.v, v)
	})

	t.Run("DecoderNotFound", func(t *testing.T) {
		registry := NewDecoderRegistry()

		v := map[string]any{}

		err := registry.Decode("myformat", nil, v)
		assert.ErrorIs(t, err, ErrDecoderNotFound)
	})
}