#include "debug.h"
#include <algorithm>  // for max
#include "resource.h" // for Resource
#include "screen.h"	  // for Screen
#include "text.h"	  // for Text
#include "utils.h"	  // for Color

// [SINGLETON]
Debug *Debug::debug_ = nullptr;

// [SINGLETON] Crearemos el objeto con esta función estática
void Debug::init()
{
	Debug::debug_ = new Debug();
}

// [SINGLETON] Destruiremos el objeto con esta función estática
void Debug::destroy()
{
	delete Debug::debug_;
}

// [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él
Debug *Debug::get()
{
	return Debug::debug_;
}

// Dibuja en pantalla
void Debug::render()
{
	auto text = Resource::get()->getText("debug");
	int y = y_;
	int w = 0;

	for (const auto &s : slot_)
	{
		text->write(x_, y, s);
		w = (std::max(w, (int)s.length()));
		y += text->getCharacterSize() + 1;
		if (y > 192 - text->getCharacterSize())
		{
			y = y_;
			x_ += w * text->getCharacterSize() + 2;
		}
	}

	y = 0;
	for (const auto &l : log_)
	{
		text->writeColored(x_ + 10, y, l, Color(255, 255, 255));
		y += text->getCharacterSize() + 1;
	}
}

// Establece la posición donde se colocará la información de debug
void Debug::setPos(SDL_Point p)
{
	x_ = p.x;
	y_ = p.y;
}