#pragma once

#include <SDL3/SDL.h>

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

class AnimatedSprite;

/**
 * @brief Llave coleccionable
 *
 * Entidad de 16x16 px con una animación "default". Al ser recogida por el
 * jugador, su identificador (id_) se añade al Inventory global y la llave
 * desaparece de la habitación. Una llave puede abrir todas las puertas con
 * el mismo id; no se consume al usarse.
 */
class Key {
   public:
    struct Data {
        std::string animation_path;  // Ruta al fichero de animación (ej. "key1.yaml")
        std::string id;              // Identificador que abre las puertas con el mismo id
        float x{0.0F};               // Posición X en píxeles
        float y{0.0F};               // Posición Y en píxeles
    };

    static constexpr float FLOAT_PERIOD_S = 2.0F;   // Segundos por ciclo sinusoidal (todas las llaves sincronizadas)
    static constexpr float FLOAT_AMPLITUDE = 2.0F;  // Amplitud en píxeles

    explicit Key(const Data& data);
    ~Key() = default;

    void render();                  // Pinta la llave en pantalla
    void update(float delta_time);  // Avanza la animación

    auto getCollider() -> SDL_FRect& { return collider_; }                  // Rectángulo de colisión
    [[nodiscard]] auto getPos() const -> SDL_FPoint;                        // Posición actual (para tracker)
    [[nodiscard]] auto getId() const -> const std::string& { return id_; }  // Identificador de la llave

    void setPaused(bool paused) { is_paused_ = paused; }  // Pausa/despausa la animación

#ifdef _DEBUG
    void setPosition(float x, float y);  // Mueve sprite y collider en vivo (editor)
#endif

   private:
    std::shared_ptr<AnimatedSprite> sprite_;  // Sprite animado de la llave
    SDL_FRect collider_{};                    // Rectángulo de colisión
    std::string id_;                          // Identificador
    float base_y_{0.0F};                      // Posición Y base (el sprite oscila alrededor)
    bool is_paused_{false};                   // Indica si la llave está pausada
};
