#pragma once
#include <string>
#include <vector>
#include <map>
#include <memory>

class Dictionary
{
public:
    Dictionary() = default;
    virtual ~Dictionary() = default;

    bool HasKey(const std::string& key) const;

    bool HasStringKey(const std::string& key) const;

    bool HasDictKey(const std::string& key) const;

    Dictionary* GetDict(const std::string& key) const;

    std::vector<std::string> GetDictKeys() const;

    std::vector<std::string> GetStringKeys() const;

    std::string GetItem(const std::string& key) const;

    void AddStringItem(const std::string& key, const std::string& item);

    void AddDictItem(const std::string& key, std::unique_ptr<Dictionary> dict);

protected:

    std::map<std::string, std::string> mStringData;
    std::map<std::string, std::unique_ptr<Dictionary> > mDictData;
};
