#pragma once
#include "imgui/imgui.h"
#include <functional>
#if defined(IMGUI_IMPL_OPENGL_ES2)
#include <SDL_opengles2.h>
#else
#include <SDL_opengl.h>
#endif
#include <SDL.h>
#include <SDL_video.h>
#ifdef __EMSCRIPTEN__
#include "emscripten_mainloop_stub.h"
#include <emscripten.h>
#include <emscripten/html5.h>
#endif
#include <string>
#include "theme.h"
static const char* NAME = "Looper";
class RendererBackend {
    void BackendDeinit();
    void LoopFunction();
    void BackendInit();
    bool started = false;
    //SDL_GLContext gl_context;
    bool resize_needed = true;
    void on_resize();
    bool update_scale = false;
    public:
    std::optional<bool> touchScreenModeOverride;
    std::optional<double> scaleOverride;
    bool isTouchScreenMode();
    static void resize_static();
    double scale = 1.0;
    SDL_Window *window;
    SDL_Renderer *rend;
    int window_width = 475;
    int window_height = 354;
    bool done = false;
    Theme *theme;
    bool vsync = false;
    std::string lang;
    std::string userdir;
    int framerate = 60;
    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
    ImFont *title;
    const char *prefPath;
    ImVec4 accent_color = ImVec4(0.75, 1.0, 1.0, 1.0);
    int Run();
    void SetWindowTitle(const char *title);
    virtual void Init();
    virtual void GuiFunction();
    virtual void Deinit();
    virtual void Drop(std::string file);
    void OnScale(float scale);
    void UpdateScale();
    void QueueUpdateScale();
    void AddFonts();
    void SetWindowSize(int w, int h);
    void GetWindowsize(int *w, int *h);
    RendererBackend();
    virtual ~RendererBackend();
    friend void main_loop();
    friend void backend_init(void *userdata);
};