package accounting

import (
	"encoding/binary"

	"github.com/nspcc-dev/neofs-proto/refs"
)

type (
	// MessageID type alias.
	MessageID = refs.MessageID
)

// SetSignature sets signature to PutRequest to satisfy SignedRequest interface.
func (m *PutRequest) SetSignature(v []byte) { m.Signature = v }

// SetSignature sets signature to DeleteRequest to satisfy SignedRequest interface.
func (m *DeleteRequest) SetSignature(v []byte) { m.Signature = v }

// PrepareData prepares bytes representation of PutRequest to satisfy SignedRequest interface.
func (m *PutRequest) PrepareData() ([]byte, error) {
	var offset int
	// MessageID-len + OwnerID-len + Amount + Height
	buf := make([]byte, refs.UUIDSize+refs.OwnerIDSize+binary.MaxVarintLen64+binary.MaxVarintLen64)
	offset += copy(buf[offset:], m.MessageID.Bytes())
	offset += copy(buf[offset:], m.OwnerID.Bytes())
	offset += binary.PutVarint(buf[offset:], m.Amount.Value)
	binary.PutUvarint(buf[offset:], m.Height)
	return buf, nil
}

// PrepareData prepares bytes representation of DeleteRequest to satisfy SignedRequest interface.
func (m *DeleteRequest) PrepareData() ([]byte, error) {
	var offset int
	// ID-len + OwnerID-len + MessageID-len
	buf := make([]byte, refs.UUIDSize+refs.OwnerIDSize+refs.UUIDSize)
	offset += copy(buf[offset:], m.ID.Bytes())
	offset += copy(buf[offset:], m.OwnerID.Bytes())
	copy(buf[offset:], m.MessageID.Bytes())
	return buf, nil
}