#pragma once

#include <frostbite2D/types/type_alias.h>
#include <frostbite2D/resource/asset.h>
#include <json/json.hpp>
#include <squirrel.h>    // Squirrel核心头文件
#include <sqstdio.h>     // Squirrel标准IO库
#include <sqstdaux.h>    // 新增：包含 sqstd_seterrorhandlers 等辅助函数
#include <sqstdblob.h>   // 新增：包含 sqstd_register_bloblib 函数
#include <sqstdsystem.h> // 新增：包含 sqstd_register_systemlib 函数
#include <sqstdmath.h>   // 新增：包含 sqstd_register_mathlib 函数
#include <sqstdstring.h> // 新增：包含 sqstd_register_stringlib 函数

#include <string>

namespace frostbite2D {

class SquirrelVM {
public:
  static SquirrelVM &get();

  void setScriptDirectory(const std::string &path);
  void setDebugMode(bool enable);

  bool init();
  void shutdown();
  void loadScript();
  void run();

  HSQUIRRELVM getVM() const { return vm_; }
  bool isValid() const { return vm_ != nullptr; }
  bool isInitialized() const { return initialized_; }

private:
  SquirrelVM() = default;
  ~SquirrelVM() = default;

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

  static void printCallback(HSQUIRRELVM vm, const char *s, ...);
  static void errorCallback(HSQUIRRELVM vm, const char *s, ...);

  bool loadScriptFile(const std::string &path);

  HSQUIRRELVM vm_ = nullptr;
  bool initialized_ = false;
  std::string scriptDirectory_;
  bool debugMode_ = false;
};

} // namespace frostbite2D
