#ifndef FSFW_DATAPOOLLOCAL_LOCALPOOLOBJECTBASE_H_
#define FSFW_DATAPOOLLOCAL_LOCALPOOLOBJECTBASE_H_

#include "MarkChangedIF.h"
#include "localPoolDefinitions.h"

#include "../objectmanager/SystemObjectIF.h"
#include "../datapool/PoolVariableIF.h"
#include "../returnvalues/HasReturnvaluesIF.h"

class LocalDataPoolManager;
class DataSetIF;
class HasLocalDataPoolIF;

/**
 * @brief 	This class serves as a non-template base for pool objects like pool variables
 * 			or pool vectors.
 */
class LocalPoolObjectBase: public PoolVariableIF,
        public HasReturnvaluesIF,
        public MarkChangedIF {
public:
    LocalPoolObjectBase(lp_id_t poolId,
            HasLocalDataPoolIF* hkOwner, DataSetIF* dataSet,
            pool_rwm_t setReadWriteMode);

    LocalPoolObjectBase(object_id_t poolOwner, lp_id_t poolId,
            DataSetIF* dataSet = nullptr,
            pool_rwm_t setReadWriteMode = pool_rwm_t::VAR_READ_WRITE);

    void setReadWriteMode(pool_rwm_t newReadWriteMode);
    pool_rwm_t getReadWriteMode() const;

    bool isValid() const override;
    void setValid(bool valid) override;

    void setChanged(bool changed) override;
    bool hasChanged() const override;

    lp_id_t getDataPoolId() const override;
    void setDataPoolId(lp_id_t poolId);

protected:
    /**
     * @brief   To access the correct data pool entry on read and commit calls,
     *          the data pool id is stored.
     */
    uint32_t localPoolId = PoolVariableIF::NO_PARAMETER;
    /**
     * @brief   The valid information as it was stored in the data pool
     *          is copied to this attribute.
     */
    bool valid = false;

    /**
     * @brief   A local pool variable can be marked as changed.
     */
    bool changed = false;

    /**
     * @brief   The information whether the class is read-write or
     *          read-only is stored here.
     */
    ReadWriteMode_t readWriteMode = pool_rwm_t::VAR_READ_WRITE;

    //! @brief  Pointer to the class which manages the HK pool.
    LocalDataPoolManager* hkManager = nullptr;

    void reportReadCommitError(const char* variableType,
            ReturnValue_t error, bool read, object_id_t objectId, lp_id_t lpId);
};

#endif /* FSFW_DATAPOOLLOCAL_LOCALPOOLOBJECTBASE_H_ */