#pragma once

#include <memory> // Para shared_ptr
#include <string> // Para string
class Text;

// Clase Writer. Pinta texto en pantalla letra a letra a partir de una cadena y un objeto Text
class Writer
{
public:
	// Constructor
	explicit Writer(std::shared_ptr<Text> text)
		: text_(text) {}

	// Destructor
	~Writer() = default;

	// Actualiza el objeto
	void update();

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

	// Setters
	void setPosX(int value);				  // Establece la posición X
	void setPosY(int value);				  // Establece la posición Y
	void setKerning(int value);				  // Establece el kerning (espaciado entre caracteres)
	void setCaption(const std::string &text); // Establece el texto a escribir
	void setSpeed(int value);				  // Establece la velocidad de escritura
	void setEnabled(bool value);			  // Habilita o deshabilita el objeto
	void setFinishedCounter(int time);		  // Establece el temporizador para deshabilitar el objeto

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

	// Getters
	bool IsEnabled() const;	  // Indica si el objeto está habilitado
	bool hasFinished() const; // Indica si ya ha terminado

private:
	// --- Objetos y punteros ---
	std::shared_ptr<Text> text_; // Objeto encargado de escribir el texto

	// --- Variables de estado ---
	int pos_x_ = 0;						  // Posición en el eje X donde empezar a escribir el texto
	int pos_y_ = 0;						  // Posición en el eje Y donde empezar a escribir el texto
	int kerning_ = 0;					  // Kerning del texto, es decir, espaciado entre caracteres
	std::string caption_ = std::string(); // El texto para escribir
	int speed_ = 0;						  // Velocidad de escritura
	int writing_counter_ = 0;			  // Temporizador de escritura para cada caracter
	int index_ = 0;						  // Posición del texto que se está escribiendo
	int lenght_ = 0;					  // Longitud de la cadena a escribir
	bool completed_ = false;			  // Indica si se ha escrito todo el texto
	bool enabled_ = false;				  // Indica si el objeto está habilitado
	int enabled_counter_ = 0;			  // Temporizador para deshabilitar el objeto
	bool finished_ = false;				  // Indica si ya ha terminado
};