#include "core/rendering/writer.hpp"

#include "core/rendering/text.hpp"  // Para Text

// Actualiza el objeto (delta_time en ms)
void Writer::update(float delta_time) {
    if (enabled_) {
        if (!completed_) {
            // No completado
            writing_timer_ += delta_time;
            if (writing_timer_ >= speed_interval_) {
                index_++;
                writing_timer_ = 0.0F;
            }

            if (index_ == length_) {
                completed_ = true;
            }
        } else {
            // Completado
            enabled_timer_ += delta_time;
            finished_ = enabled_timer_ >= enabled_timer_target_;
        }
    }
}

// Actualiza el objeto (delta_time en segundos)
void Writer::updateS(float delta_time) {
    // Convierte segundos a milisegundos y usa la lógica normal
    update(delta_time * 1000.0F);
}

// Dibuja el objeto en pantalla
void Writer::render() const {
    if (enabled_) {
        text_->write(pos_x_, pos_y_, caption_, kerning_, index_);
    }
}

// Establece el valor de la variable
void Writer::setPosX(int value) {
    pos_x_ = value;
}

// Establece el valor de la variable
void Writer::setPosY(int value) {
    pos_y_ = value;
}

// Establece el valor de la variable
void Writer::setKerning(int value) {
    kerning_ = value;
}

// Establece el valor de la variable
void Writer::setCaption(const std::string& text) {
    caption_ = text;
    length_ = text.length();
}

// Establece el valor de la variable (frames)
void Writer::setSpeed(int value) {
    // Convierte frames a milisegundos (frames * 16.67ms)
    constexpr float FRAME_TIME_MS = 16.67F;
    speed_interval_ = static_cast<float>(value) * FRAME_TIME_MS;
    writing_timer_ = 0.0F;
}

// Establece la velocidad en segundos entre caracteres
void Writer::setSpeedS(float value) {
    // Convierte segundos a milisegundos para consistencia interna
    speed_interval_ = value * 1000.0F;
    writing_timer_ = 0.0F;
}

// Establece el valor de la variable
void Writer::setEnabled(bool value) {
    enabled_ = value;
}

// Obtiene el valor de la variable
auto Writer::isEnabled() const -> bool {
    return enabled_;
}

// Establece el temporizador para deshabilitar el objeto (en milisegundos)
void Writer::setFinishedTimerMs(float time_ms) {
    enabled_timer_target_ = time_ms;
    enabled_timer_ = 0.0F;
}

// Establece el temporizador para deshabilitar el objeto (en segundos)
void Writer::setFinishedTimerS(float time_s) {
    enabled_timer_target_ = time_s * 1000.0F;  // Convertir segundos a milisegundos
    enabled_timer_ = 0.0F;
}

// Centra la cadena de texto a un punto X
void Writer::center(int x) {
    setPosX(x - (text_->length(caption_, kerning_) / 2));
}

// Obtiene el valor de la variable
auto Writer::hasFinished() const -> bool {
    return finished_;
}