#ifndef UNITTEST_HOSTED_TESTSERIALLINKEDPACKET_H_
#define UNITTEST_HOSTED_TESTSERIALLINKEDPACKET_H_

#include <fsfw/objectmanager/SystemObjectIF.h>
#include <fsfw/parameters/HasParametersIF.h>
#include <fsfw/serialize/SerialBufferAdapter.h>
#include <fsfw/serialize/SerialLinkedListAdapter.h>

#include <cstdint>

class TestPacket : public SerialLinkedListAdapter<SerializeIF> {
 public:
  /**
   * For Deserialization
   */
  TestPacket(const uint8_t* somePacket, size_t size, uint8_t* storePointer, size_t storeSize)
      : buffer(storePointer, storeSize) {
    setLinks();
  }

  /**
   * For Serialization
   */
  TestPacket(uint32_t header, uint32_t tail, const uint8_t* parameters, size_t paramSize)
      : header(header), buffer(parameters, paramSize), tail(tail) {
    setLinks();
  }

  [[nodiscard]] uint32_t getHeader() const { return header.entry; }

  [[nodiscard]] const uint8_t* getBuffer() const { return buffer.entry.getConstBuffer(); }

  size_t getBufferLength() { return buffer.getSerializedSize(); }

  [[nodiscard]] uint16_t getTail() const { return tail.entry; }

 private:
  void setLinks() {
    setStart(&header);
    header.setNext(&buffer);
    buffer.setNext(&tail);
    tail.setEnd();
  }

  SerializeElement<uint32_t> header = 0;
  SerializeElement<SerialBufferAdapter<uint8_t>> buffer;
  SerializeElement<uint32_t> tail = 0;
};

#endif /* UNITTEST_HOSTED_TESTSERIALLINKEDPACKET_H_ */