#ifndef JSON_FILE_H_
#define JSON_FILE_H_

#include "reader.h"
#include <fstream>

#define JV_STRING(_json_, _key_, _value_, _default_) (_json_.isMember(_key_) && _json_[_key_].isString()) ? _value_ = _json_[_key_].asString() : _value_ = _default_;
#define JV_INT(_json_, _key_, _value_, _default_) (_json_.isMember(_key_) && _json_[_key_].isInt()) ? _value_ = _json_[_key_].asInt() : _value_ = _default_;
#define JV_INT64(_json_, _key_, _value_, _default_) (_json_.isMember(_key_) && _json_[_key_].isInt64()) ? _value_ = _json_[_key_].asInt64() : _value_ = _default_;
#define JV_UINT(_json_, _key_, _value_, _default_) (_json_.isMember(_key_) && _json_[_key_].isUInt()) ? _value_ = _json_[_key_].asUInt() : _value_ = _default_;
#define JV_UINT64(_json_, _key_, _value_, _default_) (_json_.isMember(_key_) && _json_[_key_].isUInt64()) ? _value_ = _json_[_key_].asUInt64() : _value_ = _default_;
#define JV_BOOL(_json_, _key_, _value_, _default_) (_json_.isMember(_key_) && _json_[_key_].isBool()) ? _value_ = _json_[_key_].asBool() : _value_ = _default_;
#define JV_DOUBLE(_json_, _key_, _value_, _default_) (_json_.isMember(_key_) && _json_[_key_].isDouble()) ? _value_ = _json_[_key_].asDouble() : _value_ = _default_;

const std::string DEFAULT_STRING = "";
const int DEFAULT_INT = 0;
const bool DEFAULT_BOOL = false;
const double DEFAULT_DOUBLE = 0;

static bool ReadJsonFile(std::string file, Json::Value &json_data, std::ios_base::openmode mode = std::ios::in | std::ios::binary) {
    std::fstream json_file;
    json_file.open(file.c_str(), mode);

    if(false == json_file.is_open()) {
        return false;
    }

    bool ret = false;
    Json::Reader json_reader;
    ret = json_reader.parse(json_file, json_data);
    json_file.close();

    return ret;
}

static bool WriteJsonFile(std::string file, Json::Value &json_data, std::ios_base::openmode mode = std::ios::out | std::ios::trunc) {
    std::fstream json_file;
    json_file.open(file.c_str(), mode);

    if(false == json_file.is_open()) {
        return false;
    }

    json_file << json_data;
    json_file.close();
    return true;
}
#endif
