#pragma once

#include <fsfw/ipc/MessageQueueIF.h>
#include <fsfw/objectmanager/SystemObject.h>
#include <fsfw/tasks/ExecutableObjectIF.h>
#include <linux/ipcore/PtmeIF.h>
#include <mission/com/VirtualChannel.h>

#include <atomic>

#include "OBSWConfig.h"
#include "fsfw/returnvalues/returnvalue.h"
#include "fsfw/tmtcservices/AcceptsTelemetryIF.h"

class StorageManagerIF;

/**
 * @brief   This class represents a virtual channel. Sending a tm message to an object of this class
 *          will forward the tm packet to the respective virtual channel of the PTME IP Core.
 *
 * @author  J. Meier
 */
class VirtualChannelWithQueue : public VirtualChannel, public AcceptsTelemetryIF {
 public:
  /**
   * @brief   Constructor
   *
   * @param vcId  The virtual channel id assigned to this object
   * @param tmQueueDepth  Queue depth of queue receiving telemetry from other objects
   */
  VirtualChannelWithQueue(object_id_t objectId, uint8_t vcId, const char* vcName, PtmeIF& ptme,
                          const std::atomic_bool& linkStateProvider, StorageManagerIF& tmStore,
                          uint32_t tmQueueDepth);

  MessageQueueId_t getReportReceptionQueue(uint8_t virtualChannel = 0) const override;
  [[nodiscard]] const char* getName() const override;
  ReturnValue_t handleNextTm(bool performWriteOp);

 private:
  MessageQueueIF* tmQueue = nullptr;
  StorageManagerIF& tmStore;
};