#pragma once

#include <memory>  // Para shared_ptr
#include <string>  // Para string
#include <utility>

class Text;

// --- Clase Writer: pinta texto en pantalla letra a letra ---
class Writer {
   public:
    // --- Constructor y destructor ---
    explicit Writer(std::shared_ptr<Text> text)
        : text_(std::move(text)) {}
    ~Writer() = default;

    // --- Métodos principales ---
    void update(float delta_time);   // Actualiza el objeto (delta_time en ms)
    void updateS(float delta_time);  // Actualiza el objeto (delta_time en segundos)
    void render() const;             // Dibuja el objeto en pantalla

    // --- 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 (frames)
    void setSpeedS(float value);               // Establece la velocidad de escritura (segundos entre caracteres)
    void setEnabled(bool value);               // Habilita o deshabilita el objeto
    void setFinishedTimerMs(float time_ms);    // Establece el temporizador para deshabilitar el objeto (en ms)
    void setFinishedTimerS(float time_s);      // Establece el temporizador para deshabilitar el objeto (en segundos)

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

    // --- Getters ---
    [[nodiscard]] auto isEnabled() const -> bool;    // Indica si el objeto está habilitado
    [[nodiscard]] auto hasFinished() const -> bool;  // Indica si ya ha terminado

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

    // --- Variables de estado ---
    std::string caption_;                // El texto para escribir
    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
    float speed_interval_ = 0.0F;        // Intervalo entre caracteres (ms para compatibilidad)
    float writing_timer_ = 0.0F;         // 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
    float enabled_timer_ = 0.0F;         // Temporizador para deshabilitar el objeto
    float enabled_timer_target_ = 0.0F;  // Tiempo objetivo para deshabilitar el objeto
    bool completed_ = false;             // Indica si se ha escrito todo el texto
    bool enabled_ = false;               // Indica si el objeto está habilitado
    bool finished_ = false;              // Indica si ya ha terminado
};