#ifndef VIRTUALCHANNEL_H_
#define VIRTUALCHANNEL_H_

#include <fsfw/ipc/MessageQueueIF.h>
#include <linux/obc/PtmeIF.h>

#include "OBSWConfig.h"
#include "fsfw/returnvalues/HasReturnvaluesIF.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 VirtualChannel : public AcceptsTelemetryIF, public HasReturnvaluesIF {
 public:
  /**
   * @brief   Constructor
   *
   * @param vcId  The virtual channel id assigned to this object
   * @param tmQueueDepth  Queue depth of queue receiving telemetry from other objects
   */
  VirtualChannel(uint8_t vcId, uint32_t tmQueueDepth, object_id_t ownerId);

  ReturnValue_t initialize();
  MessageQueueId_t getReportReceptionQueue(uint8_t virtualChannel = 0) override;
  ReturnValue_t performOperation();

  /**
   * @brief   Sets the PTME object which handles access to the PTME IP Core.
   *
   * @param ptme  Pointer to ptme object
   */
  void setPtmeObject(PtmeIF* ptme_);

  /**
   * @brief   Can be used by the owner to set the link state. Packets will be discarded if link
   *          to ground station is down.
   */
  void setLinkState(bool linkIsUp_);

 private:
  PtmeIF* ptme = nullptr;
  MessageQueueIF* tmQueue = nullptr;
  uint8_t vcId;

  bool linkIsUp = false;

  StorageManagerIF* tmStore = nullptr;
};

#endif /* VIRTUALCHANNEL_H_ */