#ifndef FSFW_DATAPOOL_POOLVARIABLEIF_H_
#define FSFW_DATAPOOL_POOLVARIABLEIF_H_

#include "../returnvalues/HasReturnvaluesIF.h"
#include "../serialize/SerializeIF.h"

/**
 * @brief	This interface is used to control data pool
 * 			variable representations.
 * @details
 * To securely handle data pool variables, all pool entries are locally
 * managed by data pool variable access classes, which are called pool
 * variables. To ensure a common state of a set of variables needed in a
 * function, these local pool variables again are managed by other classes,
 * like the DataSet classes. This interface provides unified access to
 * local pool variables for such manager classes.
 * @author 	Bastian Baetz
 * @ingroup data_pool
 */
class PoolVariableIF : public SerializeIF {
	friend class PoolDataSetBase;
	friend class GlobDataSet;
	friend class LocalPoolDataSetBase;
public:
	static constexpr uint8_t INTERFACE_ID = CLASS_ID::POOL_VARIABLE_IF;
	static constexpr ReturnValue_t INVALID_READ_WRITE_MODE = MAKE_RETURN_CODE(0xA0);

	static constexpr bool VALID = 1;
	static constexpr bool INVALID = 0;
	static constexpr uint32_t NO_PARAMETER = 0xffffffff;

	enum ReadWriteMode_t {
		VAR_READ, VAR_WRITE, VAR_READ_WRITE
	};

	/**
	 * @brief	This is an empty virtual destructor,
	 * 			as it is proposed for C++ interfaces.
	 */
	virtual ~PoolVariableIF() {}
	/**
	 * @brief	This method returns if the variable is write-only,
	 * 			read-write or read-only.
	 */
	virtual ReadWriteMode_t getReadWriteMode() const = 0;
	/**
	 * @brief	This operation shall return the data pool id of the variable.
	 */
	virtual uint32_t getDataPoolId() const = 0;
	/**
	 * @brief	With this call, the valid information of the
	 * 			variable is returned.
	 */
	virtual bool isValid() const = 0;
	/**
	 * @brief	With this call, the valid information of the variable is set.
	 */
	virtual void setValid(bool validity) = 0;

	/**
	 * @brief	The commit call shall write back a newly calculated local
	 * 			value to the data pool.
	 * @details
	 * It is assumed that these calls are implemented in a thread-safe manner!
	 */
	virtual ReturnValue_t commit(uint32_t lockTimeout) = 0;
	/**
	 * @brief	The read call shall read the value of this parameter from
	 * 			the data pool and store the content locally.
	 * @details
	 * It is assumbed that these calls are implemented in a thread-safe manner!
	 */
	virtual ReturnValue_t read(uint32_t lockTimeout) = 0;

protected:

	/**
	 * @brief 	Same as commit with the difference that comitting will be
	 * 			performed without a lock
	 * @return
	 * This can be used if the lock protection is handled externally
	 * to avoid the overhead of locking and unlocking consecutively.
	 * Declared protected to avoid free public usage.
	 */
	virtual ReturnValue_t readWithoutLock() = 0;
	/**
	 * @brief 	Same as commit with the difference that comitting will be
	 * 			performed without a lock
	 * @return
	 * This can be used if the lock protection is handled externally
	 * to avoid the overhead of locking and unlocking consecutively.
	 * Declared protected to avoid free public usage.
	 */
	virtual ReturnValue_t commitWithoutLock() = 0;
};

using pool_rwm_t = PoolVariableIF::ReadWriteMode_t;

#endif /* FSFW_DATAPOOL_POOLVARIABLEIF_H_ */