#ifndef TESTS_SRC_FSFW_TESTS_UNIT_DEVICEHANDLER_DEVICEHANDLERCOMMANDER_H_
#define TESTS_SRC_FSFW_TESTS_UNIT_DEVICEHANDLER_DEVICEHANDLERCOMMANDER_H_

#include "fsfw/action/CommandActionHelper.h"
#include "fsfw/action/CommandsActionsIF.h"
#include "fsfw/objectmanager/SystemObject.h"
#include "fsfw/returnvalues/returnvalue.h"
#include "fsfw/tasks/ExecutableObjectIF.h"

class DeviceHandlerCommander : public ExecutableObjectIF,
                               public SystemObject,
                               public CommandsActionsIF {
 public:
  DeviceHandlerCommander(object_id_t objectId);
  virtual ~DeviceHandlerCommander();

  ReturnValue_t performOperation(uint8_t operationCode = 0);
  ReturnValue_t initialize() override;
  MessageQueueIF* getCommandQueuePtr() override;
  void stepSuccessfulReceived(ActionId_t actionId, uint8_t step) override;
  void stepFailedReceived(ActionId_t actionId, uint8_t step, ReturnValue_t returnCode) override;
  void dataReceived(ActionId_t actionId, const uint8_t* data, uint32_t size) override;
  void completionSuccessfulReceived(ActionId_t actionId) override;
  void completionFailedReceived(ActionId_t actionId, ReturnValue_t returnCode) override;

  /**
   * @brief	Calling this function will send the command to the device handler object.
   *
   * @param target	Object ID of the device handler
   * @param actionId	Action ID of the command to send
   */
  ReturnValue_t sendCommand(object_id_t target, ActionId_t actionId);

  ReturnValue_t getReplyReturnCode();
  void resetReplyReturnCode();

 private:
  static const uint32_t QUEUE_SIZE = 20;

  MessageQueueIF* commandQueue = nullptr;

  CommandActionHelper commandActionHelper;

  ReturnValue_t lastReplyReturnCode = returnvalue::FAILED;

  void readCommandQueue();
};

#endif /* TESTS_SRC_FSFW_TESTS_UNIT_DEVICEHANDLER_DEVICEHANDLERCOMMANDER_H_ */