#pragma once

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

#include "utils/color.hpp"  // Para Color

class Text;

// Clase para mostrar mensajes animados en la interfaz de usuario
class UIMessage {
   public:
    // Constructor: recibe el renderizador de texto, el mensaje y el color
    UIMessage(std::shared_ptr<Text> text_renderer, std::string message_text, const Color& color);

    // Muestra el mensaje con animación de entrada
    void show();

    // Oculta el mensaje con animación de salida
    void hide();

    // Actualiza el estado de la animación (debe llamarse cada frame)
    void update(float delta_time);

    // Dibuja el mensaje en pantalla si está visible
    void render();

    // Indica si el mensaje está visible actualmente
    [[nodiscard]] auto isVisible() const -> bool;

    // Permite actualizar la posición del mensaje (por ejemplo, si el menú se mueve)
    void setPosition(float new_base_x, float new_base_y);

   private:
    // --- Configuración ---
    std::shared_ptr<Text> text_renderer_;  // Renderizador de texto
    std::string text_;                     // Texto del mensaje a mostrar
    Color color_;                          // Color del texto

    // --- Estado ---
    bool visible_ = false;    // Indica si el mensaje está visible
    bool animating_ = false;  // Indica si el mensaje está en proceso de animación
    float base_x_ = 0.0F;     // Posición X base donde se muestra el mensaje
    float base_y_ = 0.0F;     // Posición Y base donde se muestra el mensaje
    float y_offset_ = 0.0F;   // Desplazamiento vertical actual del mensaje (para animación)

    // --- Animación ---
    float start_y_ = 0.0F;                                 // Posición Y inicial de la animación
    float target_y_ = 0.0F;                                // Posición Y objetivo de la animación
    float animation_timer_ = 0.0F;                         // Timer actual de la animación en segundos
    static constexpr float ANIMATION_DURATION_S = 0.133F;  // Duración total de la animación (8 frames @ 60fps)
    static constexpr float DESP = -8.0F;                   // Distancia a desplazarse

    // Actualiza la interpolación de la animación (ease out/in cubic)
    void updateAnimation(float delta_time);
};