#ifndef COMMANDACTIONHELPER_H_
#define COMMANDACTIONHELPER_H_

#include "ActionMessage.h"
#include "../objectmanager/ObjectManagerIF.h"
#include "../returnvalues/HasReturnvaluesIF.h"
#include "../serialize/SerializeIF.h"
#include "../storagemanager/StorageManagerIF.h"
#include "../ipc/MessageQueueIF.h"

class CommandsActionsIF;

class CommandActionHelper {
    friend class CommandsActionsIF;
public:
    CommandActionHelper(CommandsActionsIF* owner);
    virtual ~CommandActionHelper();
    ReturnValue_t commandAction(object_id_t commandTo,
            ActionId_t actionId, const uint8_t* data, uint32_t size);
    ReturnValue_t commandAction(object_id_t commandTo,
            ActionId_t actionId, SerializeIF* data);
    ReturnValue_t initialize();
    ReturnValue_t handleReply(CommandMessage* reply);
    uint8_t getCommandCount() const;
private:
    CommandsActionsIF* owner;
    MessageQueueIF* queueToUse;
    StorageManagerIF* ipcStore;
    uint8_t commandCount;
    MessageQueueId_t lastTarget;
    void extractDataForOwner(ActionId_t actionId, store_address_t storeId);
    ReturnValue_t sendCommand(MessageQueueId_t queueId, ActionId_t actionId,
            store_address_t storeId);
};

#endif /* COMMANDACTIONHELPER_H_ */