package internal

import (
	"encoding/json"
	"testing"

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

func TestValue_MarshalJSON(t *testing.T) {
	testCases := []struct {
		desc     string
		record   Record
		expected string
	}{
		{
			desc: "empty content",
			record: Record{
				Name:    "_acme-challenge.www",
				Type:    "TXT",
				TTL:     30,
				Content: Value{},
			},
			expected: `{"name":"_acme-challenge.www","type":"TXT","ttl":30}`,
		},
		{
			desc: "content with a single value",
			record: Record{
				Name:    "_acme-challenge.www",
				Type:    "TXT",
				TTL:     30,
				Content: Value{"aaa"},
			},
			expected: `{"name":"_acme-challenge.www","type":"TXT","ttl":30,"content":"aaa"}`,
		},
		{
			desc: "content with multiple values",
			record: Record{
				Name:    "_acme-challenge.www",
				Type:    "TXT",
				TTL:     30,
				Content: Value{"aaa", "bbb", "ccc"},
			},
			expected: `{"name":"_acme-challenge.www","type":"TXT","ttl":30,"content":["aaa","bbb","ccc"]}`,
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			content, err := json.Marshal(test.record)
			require.NoError(t, err)

			assert.JSONEq(t, test.expected, string(content))
		})
	}
}

func TestValue_UnmarshalJSON(t *testing.T) {
	testCases := []struct {
		desc     string
		data     string
		expected Record
	}{
		{
			desc: "empty content",
			data: `{"name":"_acme-challenge.www","type":"TXT","ttl":30}`,
			expected: Record{
				Name:    "_acme-challenge.www",
				Type:    "TXT",
				TTL:     30,
				Content: Value(nil),
			},
		},
		{
			desc: "content with a single value",
			data: `{"name":"_acme-challenge.www","type":"TXT","ttl":30,"content":"aaa"}`,
			expected: Record{
				Name:    "_acme-challenge.www",
				Type:    "TXT",
				TTL:     30,
				Content: Value{"aaa"},
			},
		},
		{
			desc: "content with multiple values",
			data: `{"name":"_acme-challenge.www","type":"TXT","ttl":30,"content":["aaa","bbb","ccc"]}`,
			expected: Record{
				Name:    "_acme-challenge.www",
				Type:    "TXT",
				TTL:     30,
				Content: Value{"aaa", "bbb", "ccc"},
			},
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			record := Record{}
			err := json.Unmarshal([]byte(test.data), &record)
			require.NoError(t, err)

			assert.Equal(t, test.expected, record)
		})
	}
}