package heartbeat

import (
	"encoding/binary"
	"fmt"
	"primesys_producer/src/logger"
	"primesys_producer/src/protocol/crc"
	"primesys_producer/src/server/frame"
	. "primesys_producer/src/types"
)

// Protocol Number 0x36

type HeartBeatPacket struct {
	SerialNumber uint16
}

func DecodeHeartBeatSerial(f frame.Frame) (HeartBeatPacket, error) {
	body := f.Body()

	logger.Info("HeartBeat Packet")

	if len(body) < int(GlobalPacketSize) {
		logger.Warn("packet len error packet not enough size %d expected %d", len(body), GlobalPacketSize)
		return HeartBeatPacket{}, fmt.Errorf("Heart Beat packet size less")
	}

	serial := binary.BigEndian.Uint16(f.SerialNumber())

	return HeartBeatPacket{
		SerialNumber: serial,
	}, nil
}

func EncodeSerialACK(serial uint16, protocolNunber ProtocolNumber, imei int64) []byte {
	logger.Info("HeartBeat Packet for imei %d", imei)
	const requiredPacketLen = 5
	s1 := byte(serial >> 8)
	s2 := byte(serial)

	crcInput := []byte{requiredPacketLen, byte(protocolNunber), s1, s2}
	hi, lo := crc.CRC16X25Bytes(crcInput)
	ack := make([]byte, 0, 10)
	ack = append(ack, StartShortByte, StartShortByte, requiredPacketLen, byte(protocolNunber), s1, s2, hi, lo, StopByte1, StopByte2)
	return ack
}
