#pragma once

/**
 * \file BlitzConfig.h
 * \brief File containing the blitz::BlitzConfig class
 */

#include "blitz/game/Game.h"
#include <array>
#include <string>

namespace blitz {

/**
 * \enum KeyAction
 * \brief Enum containing the key actions
 */
enum KeyAction {
	kaAvancer = 0,
	kaReculer,
	kaDroite,
	kaGauche,
	kaFenetreAdmin,
	kaMax,
};

typedef std::array<int, kaMax> Keybinds;

/**
 * \class BlitzConfig
 * \brief Class used to manage the Blitz configuration
 */
class BlitzConfig {
  private:
	std::array<char, 20> m_Pseudo;
	game::GameConfig m_ServerConfig;
	bool m_VSync;
	bool m_DisplayFps;
	Keybinds m_Keybinds{};
	float m_MouseSpeed;

  public:
	/**
	 * \brief Default constructor
	 */
	BlitzConfig();
	~BlitzConfig();

	std::array<char, 20>& GetPseudo() {
		return m_Pseudo;
	}

	/**
	 * \brief Return whether VSync is enabled
	 */
	bool IsVSyncEnabled() const {
		return m_VSync;
	}

	/**
	 * \brief Set whether VSync is enabled
	 */
	void SetVSync(bool vsync) {
		m_VSync = vsync;
	}

	/**
	 * \brief Return whether the FPS display is enabled
	 */
	bool IsFPSDisplayEnabled() const {
		return m_DisplayFps;
	}

	/**
	 * \brief Set whether the FPS display is enabled
	 */
	void SetFPSDisplay(bool display) {
		m_DisplayFps = display;
	}

	/**
	 * \brief Get the keybinds
	 * \return The keybinds
	 */
	Keybinds& GetKeys() {
		return m_Keybinds;
	}

	/**
	 * \brief Get the mouse speed
	 * \return The mouse speed
	 */
	float GetMouseSpeed() const {
		return m_MouseSpeed;
	}

	/**
	 * \brief Set the mouse speed
	 */
	void SetMouseSpeed(float MouseSpeed) {
		m_MouseSpeed = MouseSpeed;
	}

	/**
	 * \brief Get the server configuration
	 * \return The server configuration
	 */
	game::GameConfig& GetServerConfig() {
		return m_ServerConfig;
	}

  private:
	void LoadConfig();
	void LoadDefaultConfig();
	void SaveConfig();
};

}  // namespace blitz
