#ifndef SCENE_HIERARCHY_HPP
#define SCENE_HIERARCHY_HPP

#include <entt/core/fwd.hpp>
#include <entt/entity/fwd.hpp>
#include <open_engine.hpp>

namespace OpenEngine {

    using ComponentDrawer = std::function<void(entt::registry&, entt::entity)>;

    struct ComponentUI {
        std::string name;
        std::function<void(entt::registry&, entt::entity)> draw_func;
        std::function<void(entt::registry&, entt::entity)> remove_func;
    };

    class SceneHierarchy
    {
        public:
            SceneHierarchy() = default;
            SceneHierarchy(const Ref<Scene>& scene);

            void Init(const Ref<Scene>& scene);

            void OnImGuiRender();

            Entity GetSelectedEntity() const { return selected_context; };
            void SetSelectedEntity(Entity entity) { selected_context = entity; };
            void ClearSelection() { selected_context = {}; };

        private:
            void DrawEntityNode(Entity& entity);
            void DrawComponents(Entity& entity);

        private:
            template<typename T>
                static void RegisterDrawer(const std::string& name, std::function<void(entt::registry&, entt::entity)> func) {
                    drawers[entt::type_id<T>().hash()] = {
                        name,
                        func,
                        [](entt::registry& reg, entt::entity ent) { reg.remove<T>(ent); }
                    };
                }

            inline static std::map<entt::id_type, ComponentUI> drawers;
            Ref<Scene> scene;
            Entity selected_context, renamed_entity;
            double last_selected_time = 10.0;
    };
}

#endif // SCENE_HIERARCHY_HPP
