#pragma once

#include <cartridge/cartridge.h>
#include <wx/wx.h>
#include <memory>
#include <string>

extern "C" {
struct lua_State;
}

class cApp : public wxApp
{
public:
  bool OnInit() override;
  int OnExit() override;

  bool loadCartridge(const std::string &filePath);
  void startGame() const;
  void unloadCartridge();

  // Save/Load game state
  bool saveGameState(const std::string &saveFilePath) const;
  bool loadGameState(const std::string &saveFilePath) const;
  std::string getAutoSavePath() const;

  // Generate completion log (for wherigo.com)
  bool generateCompletionLog(const std::string &logFilePath) const;
  std::string getCompletionLogPath() const;

  lua_State* getLuaState() const { return m_luaState; }
  int getCartridgeRef() const { return m_cartridgeRef; }
  cartridge::Cartridge* getCartridge() const { return m_cartridge.get(); }
  bool isCartridgeLoaded() const { return m_cartridge != nullptr; }
  std::string getCartridgePath() const { return m_cartridgePath; }

private:
  bool initLuaState();

  lua_State* m_luaState = nullptr;
  int m_cartridgeRef = -1; // LUA_NOREF
  std::unique_ptr<cartridge::Cartridge> m_cartridge;
  std::string m_cartridgePath;
};
