#pragma once

/**
 * \file KeepAlivePacket.h
 * \brief File containing the blitz::protocol::KeepAlivePacket class
 */

#include "blitz/common/VarInt.h"
#include "blitz/protocol/Protocol.h"

namespace blitz {
namespace protocol {

/**
 * \class KeepAlivePacket
 * \brief Packet sent to measure the health of a connexion. \n
 * The client must respond with the same alive ID. Else, the connexion will be closed. \n
 * %Packet structure :
 * |      PacketType 		|
 * |------------------------|
 * |  PacketType::KeepAlive	|
 *
 * |	 Field Name 	|  Field Type	|  			  						Notes 									|
 * |--------------------|---------------|---------------------------------------------------------------------------|
 * |	Keep Alive ID	|    VarInt 	| The server generates a random ID, the client must respond with the same	|
 *
 */
class KeepAlivePacket : public Packet {
  private:
	VarInt m_AliveID;

  public:
	KeepAlivePacket() {}
	KeepAlivePacket(std::uint64_t aliveID) : m_AliveID(aliveID) {}
	virtual ~KeepAlivePacket() {}

	virtual DataBuffer Serialize(bool packetID = true) const;
	virtual void Deserialize(DataBuffer& data);
	virtual void Dispatch(PacketHandler* handler) const;

	/**
	 * \brief Getter of the alive ID
	 * \return The alive ID
	 */
	std::uint64_t GetAliveID() const {
		return m_AliveID.GetValue();
	}

	virtual PacketType GetType() const {
		return PacketType::KeepAlive;
	}
};

}  // namespace protocol
}  // namespace blitz
