package schema

import (
	"encoding/json"
	"testing"

	"github.com/golang/protobuf/proto"
	. "github.com/seaweedfs/seaweedfs/weed/pb/schema_pb"
	"github.com/stretchr/testify/assert"
)

func TestEnumScalarType(t *testing.T) {
	tests := []struct {
		name     string
		enum     ScalarType
		expected int32
	}{
		{"Boolean", ScalarType_BOOL, 0},
		{"Integer", ScalarType_INT32, 1},
		{"Long", ScalarType_INT64, 3},
		{"Float", ScalarType_FLOAT, 4},
		{"Double", ScalarType_DOUBLE, 5},
		{"Bytes", ScalarType_BYTES, 6},
		{"String", ScalarType_STRING, 7},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			assert.Equal(t, tt.expected, int32(tt.enum))
		})
	}
}

func TestField(t *testing.T) {
	field := &Field{
		Name:       "field_name",
		Type:       &Type{Kind: &Type_ScalarType{ScalarType: ScalarType_INT32}},
		FieldIndex: 1,
		IsRepeated: false,
	}
	assert.NotNil(t, field)
}

func TestRecordType(t *testing.T) {
	subRecord := &RecordType{
		Fields: []*Field{
			{
				Name:       "field_1",
				Type:       &Type{Kind: &Type_ScalarType{ScalarType: ScalarType_INT32}},
				FieldIndex: 1,
				IsRepeated: false,
			},
			{
				Name:       "field_2",
				Type:       &Type{Kind: &Type_ScalarType{ScalarType: ScalarType_STRING}},
				FieldIndex: 2,
				IsRepeated: false,
			},
		},
	}
	record := &RecordType{
		Fields: []*Field{
			{
				Name:       "field_key",
				Type:       &Type{Kind: &Type_ScalarType{ScalarType: ScalarType_INT32}},
				FieldIndex: 1,
				IsRepeated: false,
			},
			{
				Name:       "field_record",
				Type:       &Type{Kind: &Type_RecordType{RecordType: subRecord}},
				FieldIndex: 2,
				IsRepeated: false,
			},
		},
	}

	// serialize record to protobuf text marshalling
	text := proto.MarshalTextString(record)
	println(text)

	bytes, _ := json.Marshal(record)
	println(string(bytes))

	assert.NotNil(t, record)
}
