#ifndef MISSION_TMTC_PUSLIVEDEMUX_H_
#define MISSION_TMTC_PUSLIVEDEMUX_H_

#include <fsfw/ipc/messageQueueDefinitions.h>
#include <fsfw/storagemanager/StorageManagerIF.h>
#include <fsfw/tmtcservices/AcceptsTelemetryIF.h>
#include <fsfw/tmtcservices/TmTcMessage.h>

#include <vector>

class PusLiveDemux {
 public:
  PusLiveDemux(MessageQueueIF& ownerQueue);
  ReturnValue_t demultiplexPackets(StorageManagerIF& tmStore, store_address_t origStoreId,
                                   const uint8_t* tmData, size_t tmSize);

  void addDestination(const char* name, const AcceptsTelemetryIF& downlinkDestination,
                      uint8_t vcid = 0);

 private:
  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;
  };

  MessageQueueIF& ownerQueue;
  TmTcMessage message;
  std::vector<Destination> destinations;
};

#endif /* MISSION_TMTC_PUSLIVEDEMUX_H_ */