#pragma once

#include <string> // for string, basic_string
#include <memory>
#include "text.h"

// Clase Writer. Pinta texto en pantalla letra a letra a partir de una cadena y un bitmap
class Writer
{
private:
	// Objetos y punteros
	std::shared_ptr<Text> text_; // Objeto encargado de escribir el texto

	// Variables
	int posX_;			  // Posicion en el eje X donde empezar a escribir el texto
	int posY_;			  // Posicion en el eje Y donde empezar a escribir el texto
	int kerning_;		  // Kerning del texto, es decir, espaciado entre caracteres
	std::string caption_; // El texto para escribir
	int speed_;			  // Velocidad de escritura
	int writingCounter_;  // Temporizador de escritura para cada caracter
	int index_;			  // Posición del texto que se está escribiendo
	int lenght_;		  // Longitud de la cadena a escribir
	bool completed_;	  // Indica si se ha escrito todo el texto
	bool enabled_;		  // Indica si el objeto está habilitado
	int enabledCounter_;  // Temporizador para deshabilitar el objeto
	bool finished_;		  // Indica si ya ha terminado

public:
	// Constructor
	Writer(std::shared_ptr<Text> text);

	// Destructor
	~Writer() = default;

	// Actualiza el objeto
	void update();

	// Dibuja el objeto en pantalla
	void render() const;

	// Establece el valor de la variable
	void setPosX(int value);

	// Establece el valor de la variable
	void setPosY(int value);

	// Establece el valor de la variable
	void setKerning(int value);

	// Establece el valor de la variable
	void setCaption(std::string text);

	// Establece el valor de la variable
	void setSpeed(int value);

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

	// Obtiene el valor de la variable
	bool IsEnabled() const;

	// Establece el valor de la variable
	void setFinishedCounter(int time);

	// Centra la cadena de texto a un punto X
	void center(int x);

	// Obtiene el valor de la variable
	bool hasFinished() const;
};