package refs

import (
	"encoding/binary"
	"math/bits"
)

func (m *OwnerID) StableMarshal(buf []byte) ([]byte, error) {
	if m == nil {
		return []byte{}, nil
	}

	if buf == nil {
		buf = make([]byte, m.StableSize())
	}

	var (
		i, n, offset int
	)

	// Write key field.

	buf[i] = 0x0A // id:0x1 << 3 | wiretype:0x2
	offset = binary.PutUvarint(buf[i+1:], uint64(len(m.Value)))
	n = copy(buf[i+1+offset:], m.Value)
	i += 1 + offset + n

	return buf, nil
}

func (m *OwnerID) StableSize() int {
	if m == nil {
		return 0
	}

	var (
		ln, size int
	)

	ln = len(m.Value)                        // size of key field
	size += 1 + uvarIntSize(uint64(ln)) + ln // wiretype + size of string + string

	return size
}

// uvarIntSize returns length of varint byte sequence for uint64 value 'x'.
func uvarIntSize(x uint64) int {
	return (bits.Len64(x|1) + 6) / 7
}