#pragma once

#include "ehs/EHS.h"
#include "ehs/Str.h"

namespace ehs
{
	class JsonBase;
	class JsonObj;
	class JsonArray;
	class JsonBool;
	class JsonNum;
	class JsonStr;

	class JsonVar
	{
	private:
		UInt_64 hashId;
		Str_8 id;
		JsonBase* value;

	public:
		virtual ~JsonVar();

		JsonVar();

		JsonVar(Str_8 id);

		JsonVar(Str_8 id, const JsonBase* const value);

		JsonVar(Str_8 id, const JsonBase& value);

		JsonVar(Str_8 id, const JsonObj& value);

		JsonVar(Str_8 id, const JsonArray& value);

		JsonVar(Str_8 id, const JsonBool& value);

		JsonVar(Str_8 id, const bool boolean);

		JsonVar(Str_8 id, const JsonNum& value);

		JsonVar(Str_8 id, const SInt_64 num);

		JsonVar(Str_8 id, const UInt_64 num);

		JsonVar(Str_8 id, const SInt_32 num);

		JsonVar(Str_8 id, const UInt_32 num);

		JsonVar(Str_8 id, const SInt_16 num);

		JsonVar(Str_8 id, const UInt_16 num);

		JsonVar(Str_8 id, const SInt_8 num);

		JsonVar(Str_8 id, const UInt_8 num);

		JsonVar(Str_8 id, const double num);

		JsonVar(Str_8 id, const float num);

		JsonVar(Str_8 id, const JsonStr& value);

		JsonVar(Str_8 id, const Char_8* str, const UInt_64 size = 0);

		JsonVar(Str_8 id, Str_8 str);

		JsonVar(JsonVar&& var) noexcept;

		JsonVar(const JsonVar& var);

		JsonVar& operator=(JsonVar&& var) noexcept;

		JsonVar& operator=(const JsonVar& var);

		UInt_64 GetHashId() const;

		Str_8 GetId() const;

		void SetValue(const JsonBase* const newValue);

		void SetValue(const JsonBase& newValue);

		void SetValue(const JsonObj& newValue);

		void SetValue(const JsonArray& newValue);

		void SetValue(const JsonBool& newValue);

		void SetValue(const bool newValue);

		void SetValue(const JsonNum& newValue);

		void SetValue(const float newValue);

		void SetValue(const JsonStr& newValue);

		void SetValue(const Char_8* newValue, const UInt_64 size = 0);

		void SetValue(const Str_8& newValue);

		const JsonBase* GetValue() const;

		JsonBase* GetValue();

		Str_8 ToStr(const UInt_64 level, const bool compact) const;
	};
}