/******************************************************************************
*	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 <utils/op_res.h>

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

#include <filesystem>
#include <map>

namespace lunarium 
{
    class World;
}

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


        uint32_t GetLogCat() const;
        unsigned int GetNextWindowID();
        bool IsToolOpen(ToolType type) const;

        void ChangeWorld(lunarium::World* pWorld);

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

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

        // Tools
        unsigned int mNextWindowID;
        MapEditor* mpMapEditor;

        // Panels
        struct   
        {
            uint32_t AssetBrowser;
            uint32_t WorldTree;
            uint32_t WorldView;
            uint32_t PropertiesView;
        } 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;

        // 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_