package vbantxt

import (
	"bytes"
	"encoding/binary"

	log "github.com/sirupsen/logrus"
)

const (
	vbanProtocolTxt = 0x40
	streamNameSz    = 16
	headerSz        = 4 + 1 + 1 + 1 + 1 + 16 + 4
)

var BpsOpts = []int{0, 110, 150, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 31250,
	38400, 57600, 115200, 128000, 230400, 250000, 256000, 460800, 921600,
	1000000, 1500000, 2000000, 3000000}

type packet struct {
	streamname   []byte
	bpsIndex     int
	channel      int
	framecounter []byte
	hbuf         *bytes.Buffer
}

// newPacket returns a packet struct with default values, framecounter at 0.
func newPacket(streamname string) packet {
	streamnameBuf := make([]byte, streamNameSz)
	copy(streamnameBuf, streamname)

	return packet{
		streamname:   streamnameBuf,
		bpsIndex:     0,
		channel:      0,
		framecounter: make([]byte, 4),
		hbuf:         bytes.NewBuffer(make([]byte, headerSz)),
	}
}

// sr defines the samplerate for the request
func (p *packet) sr() byte {
	return byte(vbanProtocolTxt + p.bpsIndex)
}

// nbc defines the channel of the request
func (p *packet) nbc() byte {
	return byte(p.channel)
}

// header returns a fully formed packet header
func (p *packet) header() []byte {
	p.hbuf.Reset()
	p.hbuf.WriteString("VBAN")
	p.hbuf.WriteByte(p.sr())
	p.hbuf.WriteByte(byte(0))
	p.hbuf.WriteByte(p.nbc())
	p.hbuf.WriteByte(byte(0x10))
	p.hbuf.Write(p.streamname)
	p.hbuf.Write(p.framecounter)
	return p.hbuf.Bytes()
}

// bumpFrameCounter increments the frame counter by 1
func (p *packet) bumpFrameCounter() {
	x := binary.LittleEndian.Uint32(p.framecounter)
	binary.LittleEndian.PutUint32(p.framecounter, x+1)

	log.Tracef("framecounter: %d", x)
}