/******************************************************************************
*	File		-	core.h
*	Author		-	Joey Pollack
*	Date		-	2021/08/30 (y/m/d)
*	Mod Date	-	2021/08/30 (y/m/d)
*	Description	-	The Core Engine Class. Manages the engine components.
******************************************************************************/

#ifndef CORE_H_
#define CORE_H_

#include "state.h"
#include "iRunMode.h"
#include <utils/logger.h>
#include <utils/args.h>
#include <utils/frameCounter.h>

namespace lunarium
{

    class Image;
    class Tester;
    class GUI;
    class IGraphics;
    class Window;
    class InputManager;

    class Core
    {
    public:
        static Core& GetInstance();
        static void Shutdown();

        void Initialize(int argc, char** argv);
        void SignalShutdown();

        bool IsInit() const;
        const State& GetState() const;

        void ApplyState(State newState);

        void RunGameLoop();

        OpRes BeginRenderToTexture();
        Image* EndRenderToTexture();

    private:    // DATA
        static Core* mpInstance;
        bool mbIsInit;
        State mState;
        Args* mpArgs;
        FrameCounter mFrameCounter;
        iRunMode* mpRunMode;
        bool mbMidRender;
        bool mbMidTextureRender;
        bool mbShowGuiDemo;

		// Log Files
		std::ofstream mMasterLogFile;
		std::ofstream mErrorLogFile;

    private: // SUBSYSTEMS

    Window*         mpWindow;
    IGraphics*      mpGraphics;
    InputManager*   mpInput;
    GUI&            mGUI;

    public:    // SUBSYSTEM GETTERS
        
		static Window& MainWindow();
        static IGraphics& Graphics();
        static InputManager& Input();

    private: // HIDDEN METHODS

        Core();
        Core(const Core&) = delete;
        Core& operator=(const Core&) = delete;

    private: // RUN MODES
        Tester* mpTester;
    };

}

#endif  // CORE_H_