#pragma once

#include <string>  // for string, basic_string
class Text;

// Clase Writer. Pinta texto en pantalla letra a letra a partir de una cadena y un bitmap
class Writer {
   public:
    explicit Writer(Text *text);  // Constructor

    void update();  // Actualiza el objeto
    void render();  // Dibuja el objeto en pantalla

    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(const std::string &text);      // Establece el valor de la variable
    void setSpeed(int value);                      // Establece el valor de la variable
    void setEnabled(bool value);                   // Establece el valor de la variable
    [[nodiscard]] auto isEnabled() const -> bool;  // Obtiene el valor de la variable

    void setEnabledCounter(int time);                     // Establece el valor de la variable
    [[nodiscard]] auto getEnabledCounter() const -> int;  // Obtiene el valor de la variable

    void center(int x);                              // Centra la cadena de texto a un punto X
    [[nodiscard]] auto hasFinished() const -> bool;  // Obtiene el valor de la variable

   private:
    // Objetos y punteros
    Text *text_;  // Objeto encargado de escribir el texto

    // Variables
    int pos_x_{0};            // Posicion en el eje X donde empezar a escribir el texto
    int pos_y_{0};            // Posicion en el eje Y donde empezar a escribir el texto
    int kerning_{0};          // Kerning del texto, es decir, espaciado entre caracteres
    std::string caption_;     // 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 length_{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
};
