package test

import (
	"fmt"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"

	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload"
	"github.com/iotaledger/goshimmer/packages/binary/testutil"
)

func TestMessage_StorableObjectFromKey(t *testing.T) {
	key, err := message.NewId("2DYebCqnZ8PS5PyXBEvAvLB1fCF77Rn9RtofNHjEb2pSTujKi889d31FmguAs5DgL7YURw4GP2Y28JdJ7K4bjudG")
	if err != nil {
		panic(err)
	}

	messageFromKey, consumedBytes, err := message.StorableObjectFromKey(key.Bytes())
	if err != nil {
		panic(err)
	}

	assert.Equal(t, message.IdLength, consumedBytes)
	assert.Equal(t, key, messageFromKey.(*message.Message).Id())
}

func TestMessage_MarshalUnmarshal(t *testing.T) {
	testMessage := testutil.MessageFactory(t).IssuePayload(payload.NewData([]byte("sth")))
	assert.Equal(t, true, testMessage.VerifySignature())

	fmt.Print(testMessage)

	restoredMessage, err, _ := message.FromBytes(testMessage.Bytes())
	if assert.NoError(t, err, err) {
		assert.Equal(t, testMessage.Id(), restoredMessage.Id())
		assert.Equal(t, testMessage.TrunkId(), restoredMessage.TrunkId())
		assert.Equal(t, testMessage.BranchId(), restoredMessage.BranchId())
		assert.Equal(t, testMessage.IssuerPublicKey(), restoredMessage.IssuerPublicKey())
		assert.Equal(t, testMessage.IssuingTime().Round(time.Second), restoredMessage.IssuingTime().Round(time.Second))
		assert.Equal(t, testMessage.SequenceNumber(), restoredMessage.SequenceNumber())
		assert.Equal(t, testMessage.Signature(), restoredMessage.Signature())
		assert.Equal(t, true, restoredMessage.VerifySignature())
	}
}