package common

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"google.golang.org/protobuf/proto"

	"github.com/milvus-io/milvus-proto/go-api/v3/commonpb"
)

type mockMessage struct {
	topic      string
	properties map[string]string
	payload    []byte
	id         MessageID
}

func (m *mockMessage) Topic() string {
	return m.topic
}

func (m *mockMessage) Properties() map[string]string {
	return m.properties
}

func (m *mockMessage) Payload() []byte {
	return m.payload
}

func (m *mockMessage) ID() MessageID {
	return m.id
}

func TestGetMsgType(t *testing.T) {
	t.Run("Test with properties", func(t *testing.T) {
		properties := map[string]string{
			MsgTypeKey: "Insert",
		}
		msg := &mockMessage{
			properties: properties,
		}
		msgType, err := GetMsgType(msg)
		assert.NoError(t, err)
		assert.Equal(t, commonpb.MsgType_Insert, msgType)
	})

	t.Run("Test with payload", func(t *testing.T) {
		header := &commonpb.MsgHeader{
			Base: &commonpb.MsgBase{
				MsgType: commonpb.MsgType_Insert,
			},
		}
		payload, err := proto.Marshal(header)
		assert.NoError(t, err)

		msg := &mockMessage{
			payload: payload,
		}
		msgType, err := GetMsgType(msg)
		assert.NoError(t, err)
		assert.Equal(t, commonpb.MsgType_Insert, msgType)
	})

	t.Run("Test with empty payload and properties", func(t *testing.T) {
		msg := &mockMessage{}
		msgType, err := GetMsgType(msg)
		assert.Error(t, err)
		assert.Equal(t, commonpb.MsgType_Undefined, msgType)
	})
}
