#ifndef MISSION_TMTC_TMFUNNELBASE_H_
#define MISSION_TMTC_TMFUNNELBASE_H_

#include <fsfw/objectmanager/SystemObject.h>
#include <fsfw/storagemanager/StorageManagerIF.h>
#include <fsfw/tmtcservices/AcceptsTelemetryIF.h>

#include <vector>

class TmFunnelBase : public AcceptsTelemetryIF, public SystemObject {
 public:
  TmFunnelBase(object_id_t objectId, StorageManagerIF& tmStore, uint32_t tmMsgDepth);
  void addDestination(const char* name, const AcceptsTelemetryIF& downlinkDestination,
                      uint8_t vcid = 0);
  [[nodiscard]] MessageQueueId_t getReportReceptionQueue(uint8_t virtualChannel) const override;

  virtual ~TmFunnelBase();

 protected:
  StorageManagerIF& tmStore;
  struct Destination {
    Destination(const char* name, MessageQueueId_t queueId, uint8_t virtualChannel)
        : name(name), queueId(queueId), virtualChannel(virtualChannel) {}

    const char* name;
    MessageQueueId_t queueId;
    uint8_t virtualChannel = 0;
  };

  std::vector<Destination> destinations;

  MessageQueueIF* tmQueue = nullptr;
};

#endif /* MISSION_TMTC_TMFUNNELBASE_H_ */