package proto

import (
	"encoding/binary"
	"io"

	"github.com/juju/errors"
)

// RequestHeader is for tso request proto.
type RequestHeader struct {
}

// Timestamp is for tso timestamp.
type Timestamp struct {
	Physical int64
	Logical  int64
}

// Response is for tso reponse proto.
type Response struct {
	Timestamp
}

// Encode encodes repsonse proto into w.
func (res *Response) Encode(w io.Writer) error {
	var buf [16]byte
	binary.BigEndian.PutUint64(buf[0:8], uint64(res.Physical))
	binary.BigEndian.PutUint64(buf[8:16], uint64(res.Logical))
	_, err := w.Write(buf[0:16])
	return errors.Trace(err)
}

// Decode decodes reponse proto from r.
func (res *Response) Decode(r io.Reader) error {
	var buf [16]byte
	_, err := io.ReadFull(r, buf[0:16])
	if err != nil {
		return errors.Trace(err)
	}

	res.Physical = int64(binary.BigEndian.Uint64(buf[0:8]))
	res.Logical = int64(binary.BigEndian.Uint64(buf[8:16]))
	return nil
}