#ifndef BSP_Q7S_CORE_NVMPARAMS_NVMPARAMIF_H_
#define BSP_Q7S_CORE_NVMPARAMS_NVMPARAMIF_H_

#include "fsfw/returnvalues/HasReturnvaluesIF.h"

#include <nlohmann/json.hpp>
#include <string>
#include <filesystem>

class NVMParameterBase {
public:
    virtual~ NVMParameterBase() {}

    NVMParameterBase(std::string fullName);

    bool getJsonFileExists();

    /**
     * Returns RETURN_OK on successfull read and HasFileSystemIF::FILE_DOES_NOT_EXIST if
     * file does not exist yet.
     * @return
     */
    virtual ReturnValue_t readJsonFile();

    virtual ReturnValue_t writeJsonFile();

    void setFullName(std::string fullName);
    std::string getFullName() const;

    template<typename T>
    ReturnValue_t insertValue(std::string key, T value);

    template<typename T>
    ReturnValue_t setValue(std::string key, T value);

    template<typename T>
    T getValue(std::string key) const;

    void printKeys() const;
    void print() const;

private:
    nlohmann::json json;
    std::vector<std::string> keys;
    std::string fullName;
};

template<typename T>
inline ReturnValue_t NVMParameterBase::insertValue(std::string key, T value) {
    // Check whether key already exists. If it does not, insert it
    if (std::find(keys.begin(), keys.end(), key) == keys.end()) {
        keys.push_back(key);
    }
    json[key] = value;
    return HasReturnvaluesIF::RETURN_OK;
}

template<typename T>
inline ReturnValue_t NVMParameterBase::setValue(std::string key, T value) {
    json[key] = value;
    return HasReturnvaluesIF::RETURN_OK;
}

template<typename T>
inline T NVMParameterBase::getValue(std::string key) const {
    return json[key];
}

#endif /* BSP_Q7S_CORE_NVMPARAMS_NVMPARAMIF_H_ */