#pragma once
#include "EngineFrame/Scene/Scene.h"
#include "EngineFrame/Render/RenderManager.h"
#include "Tool/RefPtr.h"
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_mixer.h>
#include <SDL_ttf.h>
#include <memory>
#include <functional>

// some switch buttons
#define JOY_A 0
#define JOY_B 1
#define JOY_X 2
#define JOY_Y 3
#define JOY_PLUS 10
#define JOY_MINUS 11
#define JOY_LEFT 12
#define JOY_UP 13
#define JOY_RIGHT 14
#define JOY_DOWN 15

class Debug_Actor;

class Game
{
#ifndef __SWITCH__
    typedef Uint32 u32;
#endif
public:
    // 删除拷贝构造和赋值运算符，确保无法复制
    Game(const Game &) = delete;
    Game &operator=(const Game &) = delete;

    // 移动构造和赋值也删除，避免意外转移
    Game(Game &&) = delete;
    Game &operator=(Game &&) = delete;

    // 全局访问点
    static Game &GetInstance()
    {
        static Game instance; // 局部静态变量，保证只初始化一次
        return instance;
    }

    void Init(std::function<void()> CallBack);
    void Run();
    void HandleEvents(SDL_Event *e);
    void Update(float deltaTime);
    void Render();
    void Clear();

    // 切换场景
    void ChangeScene(RefPtr<Scene> scene);
    // 设定UI层场景对象
    void ChangeUIScene(RefPtr<Scene> scene);

    RenderManager *GetRenderer();

private:
    // 构造函数和析构函数设为私有，防止外部创建和销毁
    Game();
    ~Game();

    // 游戏是否运行
    bool m_isRunning = true;
    // 窗口
    SDL_Window *m_window;
    // 渲染器
    RenderManager *m_renderer;

    // 游戏层场景
    RefPtr<Scene> m_scene;
    // UI层场景
    RefPtr<Scene> m_uiScene;

    // 帧数
#ifdef __SWITCH__
    float m_Settingfps = 5000.0;
#else
    float m_Settingfps = 5000.0;
#endif
    // 单帧时间
    float m_frameTime = 0.f;
    // 帧间隔
    float m_deltaTime = 0.f;
    // 每秒内的帧数计数器
    u32 m_frameCounter;
    u32 m_lastFpsPrintTime;

public:
    // 屏幕宽高
    int Screen_W = 1280;
    int Screen_H = 720;

    // 每秒帧率
    u32 m_fps;
    // 单帧时间
    u32 m_frameTime_ms;
    // 节点个数
    u32 m_nodeCount = 0;
};