#ifndef OPENMW_LUAUI_ELEMENT
#define OPENMW_LUAUI_ELEMENT

#include "widget.hpp"

namespace LuaUi
{
    struct Element
    {
        static std::shared_ptr<Element> make(sol::table layout);

        template <class Callback>
        static void forEach(Callback callback)
        {
            for (auto& [e, _] : sAllElements)
                callback(e);
        }

        WidgetExtension* mRoot;
        WidgetExtension* mAttachedTo;
        sol::object mLayout;
        std::string mLayer;
        bool mUpdate;
        bool mDestroy;

        void create();

        void update();

        void destroy();

        friend void clearUserInterface();

        void attachToWidget(WidgetExtension* w);
        void detachFromWidget();

    private:
        Element(sol::table layout);
        sol::table layout() { return LuaUtil::cast<sol::table>(mLayout); }
        static std::map<Element*, std::shared_ptr<Element>> sAllElements;
        void updateAttachment();
    };
}

#endif // !OPENMW_LUAUI_ELEMENT