package logger_test

import (
	"errors"
	"fmt"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"

	"gh.tarampamp.am/error-pages/internal/logger"
)

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

	var (
		someTime, _ = time.Parse(time.RFC3339, "2021-01-01T00:00:00Z")
		someErr     = fmt.Errorf("foo: %w", errors.New("bar"))
	)

	for name, tt := range map[string]struct {
		giveAttr logger.Attr

		wantKey   string
		wantValue any
	}{
		"String":   {logger.String("key", "value"), "key", "value"},
		"Strings":  {logger.Strings("key", "value1", "value2"), "key", []string{"value1", "value2"}},
		"Int64":    {logger.Int64("key", 42), "key", int64(42)},
		"Int":      {logger.Int("key", 42), "key", int64(42)},
		"Uint64":   {logger.Uint64("key", 42), "key", uint64(42)},
		"Uint16":   {logger.Uint16("key", 42), "key", uint64(42)},
		"Float64":  {logger.Float64("key", 42.42), "key", 42.42},
		"Bool":     {logger.Bool("key", true), "key", true},
		"Time":     {logger.Time("key", someTime), "key", someTime},
		"Duration": {logger.Duration("key", time.Second), "key", time.Second},
		"Error":    {logger.Error(someErr), "error", "foo: bar"},
		"Any":      {logger.Any("key", "value"), "key", "value"},
	} {
		t.Run(name, func(t *testing.T) {
			t.Parallel()

			assert.Equal(t, tt.wantKey, tt.giveAttr.Key)
			assert.Equal(t, tt.wantValue, tt.giveAttr.Value.Any())
		})
	}
}
