/******************************************************************************
*	File		-	editor.h
*	Author		-	Joey Pollack
*	Date		-	2021/11/01 (y/m/d)
*	Mod Date	-	2021/11/01 (y/m/d)
*	Description	-	Entry point for the editor run mode.
******************************************************************************/

#ifndef EDITOR_H_
#define EDITOR_H_

#include <core/run_mode.h>
#include <core/common_defs.h>
#include <gui/panel_manager.h>
#include <utils/op_res.h>

#include "project.h"
#include "panels/about.h"

#include <world/world.h>

#include <filesystem>
#include <map>

namespace lunarium 
{
    //class World;
    class Entity;
}

namespace lunarium { namespace editor
{
    enum ToolType
    {
        TT_MAIN_EDITOR,
        TT_MAP_EDITOR,
    };
    
    class EditorAsset;
    class MapEditor;
    class Editor : public iRunMode
    {
    public:
        static uint32_t LogCat;
        
    public:
        Editor();
        [[nodiscard]] OpRes Initialize();
        void Shutdown();
        void OnUpdate(double delta);
        void OnRender(lunarium::Renderer2D* g);


        bool IsToolOpen(ToolType type) const;


        std::filesystem::path GetAssetBrowserLocation();
        Project* GetProject();

        // Panel events
        void OnComponentAdd(lunarium::Entity* pEnt, void* pComp, lunarium::ComponentType type);
        void OnEntitySelect(lunarium::Entity* pEnt);
        //void ChangeWorld(lunarium::World* pWorld);
        void OnAssetOpen(EditorAsset* pAsset);
        void OnAssetSelected(EditorAsset* pAsset);
        void OnNewAsset(EditorAsset* pAsset);
        void OnAssetUpdate(EditorAsset* pAsset);
        void OnEntityDelete(Entity* pEnt);
        void OnPlay();
        void OnPause();
        void OnStop();

    private:
        Editor(const Editor&) = delete;
        const Editor& operator=(const Editor&) = delete;
        
    private:    // Data
        Project mProject;
        lunarium::World* mpWorld;


        // Panels
        PanelManager mPanelManager;
        struct   
        {
            u32 AssetBrowser;
            u32 WorldTree;
            u32 WorldView;
            u32 PropertiesView;
            u32 Console;
        } mPanels;
        

        // Non-Docking panels
        AboutPanel mAboutPanel;

        // Menu Bar Events
        // Don't want to handles these events during rendering
        bool mDoNewProject;
        bool mDoOpenProject;
        bool mDoSaveProject;
        bool mDoSaveAs;

        // Tools
        MapEditor* mpMapEditor;

        // TEST DATA
        

    private:    // HELPERS
        void RenderWindow();

        void DoMainMenu();
        void DoStatusBar();
        void DestroyTools();
        void HandleMenuEvents();

        void HandleOpenPanel(const char* name, uint32_t id);
    };

    
}}

#endif  // EDITOR_H_