#ifndef FSFW_DATAPOOLLOCAL_PROVIDESDATAPOOLSUBSCRIPTION_H_
#define FSFW_DATAPOOLLOCAL_PROVIDESDATAPOOLSUBSCRIPTION_H_

#include "localPoolDefinitions.h"
#include "../ipc/messageQueueDefinitions.h"
#include "../returnvalues/HasReturnvaluesIF.h"


class ProvidesDataPoolSubscriptionIF {
public:
    virtual ~ProvidesDataPoolSubscriptionIF(){};

    /**
     * @brief   Subscribe for the generation of periodic packets.
     * @details
     * This subscription mechanism will generally be used by the data creator
     * to generate housekeeping packets which are downlinked directly.
     * @return
     */
    virtual ReturnValue_t subscribeForPeriodicPacket(sid_t sid,
            bool enableReporting,
            float collectionInterval, bool isDiagnostics,
            object_id_t packetDestination) = 0;


    /**
     * @brief   Subscribe for the  generation of packets if the dataset
     *          is marked as changed.
     * @details
     * This subscription mechanism will generally be used by the data creator.
     * @param sid
     * @param isDiagnostics
     * @param packetDestination
     * @return
     */
    virtual ReturnValue_t subscribeForUpdatePackets(sid_t sid,
            bool reportingEnabled,
            bool isDiagnostics,
            object_id_t packetDestination) = 0;


    /**
     * @brief   Subscribe for a notification message which will be sent
     *          if a dataset has changed.
     * @details
     * This subscription mechanism will generally be used internally by
     * other software components.
     * @param setId     Set ID of the set to receive update messages from.
     * @param destinationObject
     * @param targetQueueId
     * @param generateSnapshot If this is set to true, a copy of the current
     * data with a timestamp will be generated and sent via message.
     * Otherwise, only an notification message is sent.
     * @return
     */
    virtual ReturnValue_t subscribeForSetUpdateMessages(const uint32_t setId,
            object_id_t destinationObject,
            MessageQueueId_t targetQueueId,
            bool generateSnapshot) = 0;

    /**
     * @brief   Subscribe for an notification message which will be sent if a
     *          pool variable has changed.
     * @details
     * This subscription mechanism will generally be used internally by
     * other software components.
     * @param localPoolId Pool ID of the pool variable
     * @param destinationObject
     * @param targetQueueId
     * @param generateSnapshot If this is set to true, a copy of the current
     * data with a timestamp will be generated and sent via message.
     * Otherwise, only an notification message is sent.
     * @return
     */
    virtual ReturnValue_t subscribeForVariableUpdateMessages(
            const lp_id_t localPoolId,
            object_id_t destinationObject,
            MessageQueueId_t targetQueueId,
            bool generateSnapshot) = 0;

};

#endif /* FSFW_DATAPOOLLOCAL_PROVIDESDATAPOOLSUBSCRIPTION_H_ */