#ifndef FSFW_EXAMPLE_COMMON_CFDPTMFUNNEL_H
#define FSFW_EXAMPLE_COMMON_CFDPTMFUNNEL_H

#include <mission/tmtc/TmFunnelBase.h>

#include <atomic>
#include <vector>

#include "fsfw/objectmanager/SystemObject.h"
#include "fsfw/storagemanager/StorageManagerIF.h"
#include "fsfw/tmtcservices/AcceptsTelemetryIF.h"
#include "fsfw/tmtcservices/TmTcMessage.h"

class CfdpTmFunnel : public TmFunnelBase {
 public:
  CfdpTmFunnel(TmFunnelBase::FunnelCfg cfg, std::optional<MessageQueueId_t> fileStoreDest,
               StorageManagerIF& ramToFileStore, uint16_t cfdpInCcsdsApid);
  [[nodiscard]] const char* getName() const override;
  uint32_t addLiveDestination(const char* name, const AcceptsTelemetryIF& downlinkDestination,
                              uint8_t vcid = 0) override;
  ReturnValue_t performOperation(uint8_t opCode);
  ReturnValue_t initialize() override;

 private:
  ReturnValue_t handlePacket(TmTcMessage& msg);

  std::optional<MessageQueueId_t> fileStoreDest;
  StorageManagerIF& ramToFileStore;
  uint16_t cfdpInCcsdsApid;
};
#endif  // FSFW_EXAMPLE_COMMON_CFDPTMFUNNEL_H