package payload

import (
	"errors"

	"github.com/nspcc-dev/neo-go/pkg/io"
	"github.com/nspcc-dev/neo-go/pkg/util"
)

// Maximum inventory hashes number is limited to 500.
const (
	MaxHashesCount = 500
)

// GetBlocks contains getblocks message payload fields.
type GetBlocks struct {
	// Hash of the latest block that node requests.
	HashStart util.Uint256
	Count     int16
}

// NewGetBlocks returns a pointer to a GetBlocks object.
func NewGetBlocks(start util.Uint256, count int16) *GetBlocks {
	return &GetBlocks{
		HashStart: start,
		Count:     count,
	}
}

// DecodeBinary implements the Serializable interface.
func (p *GetBlocks) DecodeBinary(br *io.BinReader) {
	p.HashStart.DecodeBinary(br)
	p.Count = int16(br.ReadU16LE())
	if p.Count < -1 || p.Count == 0 {
		br.Err = errors.New("invalid count")
	}
}

// EncodeBinary implements the Serializable interface.
func (p *GetBlocks) EncodeBinary(bw *io.BinWriter) {
	p.HashStart.EncodeBinary(bw)
	bw.WriteU16LE(uint16(p.Count))
}