#ifndef ENGINE_H
#define ENGINE_H

#include "SDL3/SDL.h"
#include "SDL3_image/SDL_image.h"
#include "SDL3_ttf/SDL_ttf.h"
#include "SDL3_mixer/SDL_mixer.h"

#include <map>

#include "engine/engine_typedef.h"
#include "engine/widgets/iscreen.h"

class Engine {
    private:
        struct SENGINE{
            SDL_Window* window;
            SDL_Renderer* renderer;

            float template_width;
            float template_height;

            //std::map<std::string,Screen*> listScreens;
            std::map<std::string,IScreen*> listIScreens;
            IScreen* activeScreen;
        };

    public:
        static bool init(int template_width, int template_height);
        static void stop();

        static SDL_Window* getWindow();
        static SDL_Renderer* getRenderer();

        // Получить соотношение экрана
        static float scale();

        // получить размер физического окна
        static SDL_FRect getWindowSize();

        // получить размер шаблоного окна
        static SDL_FRect getTemplateWindowSize();

        // Статическая функция, возвращающая ссылку на статическую структуру
        static SENGINE& getInstance() {
            static SENGINE instance{nullptr, nullptr, 0, 0,{}, nullptr};
            return instance;
        }

        static void addIScreen(const std::string &name, IScreen* screen);

        //static Screen* createScreen(const std::string &name);
        static void deleteScreen(const std::string &name);
        static bool setActiveScreen(const std::string &name, const VariantMap &args=VariantMap{});

        static void draw();
        static void logic();
        static void event(const SDL_Event &event);

};


#endif //ENGINE_H
