package models

import (
	"testing"

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

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

	tests := []struct {
		name  string
		value any
		want  StringSet
	}{
		{name: "bytes", value: []byte("get,post"), want: StringSet{"get", "post"}},
		{name: "string", value: "put,delete", want: StringSet{"put", "delete"}},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			var got StringSet
			require.NoError(t, got.Scan(tt.value))
			require.Equal(t, tt.want, got)
		})
	}
}

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

	var set StringSet
	require.EqualError(t, set.Scan(1), "failed to parse set: 1")
}

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

	value, err := (StringSet{"get", "post"}).Value()

	require.NoError(t, err)
	require.Equal(t, "get,post", value)
}

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

	tests := []struct {
		name  string
		value any
		want  UintList
	}{
		{name: "nil", value: nil, want: nil},
		{name: "bytes", value: []byte(`[1,2]`), want: UintList{1, 2}},
		{name: "string", value: `[3,4]`, want: UintList{3, 4}},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			got := UintList{99}
			require.NoError(t, got.Scan(tt.value))
			require.Equal(t, tt.want, got)
		})
	}
}

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

	var list UintList
	require.EqualError(t, list.Scan(1), "failed to parse uint list: int")
	require.Error(t, list.Scan("invalid"))
}

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

	tests := []struct {
		name string
		list UintList
		want any
	}{
		{name: "nil", list: nil, want: nil},
		{name: "empty", list: UintList{}, want: "[]"},
		{name: "values", list: UintList{1, 2}, want: "[1,2]"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			value, err := tt.list.Value()
			require.NoError(t, err)
			require.Equal(t, tt.want, value)
		})
	}
}
