#pragma once

#include <SDL2/SDL_rect.h>	 // Para SDL_Point
#include <SDL2/SDL_render.h> // Para SDL_Renderer
#include <string>			 // Para string
#include <vector>			 // Para vector
class Asset;
class Screen;
class Text;
class Texture;

// Clase Debug
class Debug
{
private:
	// [SINGLETON] Objeto privado
	static Debug *debug_;

	// Objetos y punteros
	Screen *screen_;		 // Objeto encargado de dibujar en pantalla
	SDL_Renderer *renderer_; // El renderizador de la ventana
	Asset *asset_;			 // Objeto con los ficheros de recursos
	Text *text_;			 // Objeto encargado de escribir texto en pantalla
	Texture *texture_;		 // Textura para el texto

	// Variables
	std::vector<std::string> slot_; // Vector con los textos a escribir
	std::vector<std::string> log_;	// Vector con los textos a escribir
	int x_ = 0;						// Posicion donde escribir el texto de debug
	int y_ = 0;						// Posición donde escribir el texto de debug
	bool enabled_ = false;			// Indica si esta activo el modo debug

	// Constructor
	Debug();

	// Destructor
	~Debug();

public:
	// [SINGLETON] Crearemos el objeto con esta función estática
	static void init();

	// [SINGLETON] Destruiremos el objeto con esta función estática
	static void destroy();

	// [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él
	static Debug *get();

	// Actualiza las variables
	void update();

	// Dibuja en pantalla
	void render();

	// Establece la posición donde se colocará la información de debug
	void setPos(SDL_Point p);

	// Añade un texto para mostrar
	void add(std::string text);

	// Borra la información de debug
	void clear();

	// Añade un texto para mostrar en el apartado log
	void addToLog(std::string text);

	// Borra la información de debug del apartado log
	void clearLog();

	// Establece el valor de la variable
	void setEnabled(bool value);

	// Obtiene el valor de la variable
	bool getEnabled();

	// Cambia el valor de la variable
	void switchEnabled();
};