#ifndef ITEM_DB_HPP
#define ITEM_DB_HPP

#include "item.hpp"
#include <godot_cpp/templates/vector.hpp>

namespace gd = godot;

class ItemDB {
    struct StaticData {
        StaticData() = default;
        ~StaticData();
        gd::String &get_hint();
        gd::String &get_array_hint();
        gd::String *array_hint{};
        gd::String *hint{};
        gd::Vector<Item *> items{};
    };
    static ItemID register_item(Item *item, gd::String item_name);

public:
    static Item const *get_item(ItemID id);
    static gd::String const &get_enum_hint();
    static gd::String const &get_array_hint();
    static Item const *get_item_by_name(gd::StringName item);

    template <class TItem>
    _FORCE_INLINE_ static ItemID register_item() {
        return ItemDB::register_item(new TItem(), TItem::get_static_class());
    }

private:
    static StaticData data;
};

#endif // !ITEM_DB_HPP