#pragma once

#include <SDL3/SDL.h>

#include <memory>  // Para shared_ptr
#include <string>  // Para string
#include <vector>  // Para vector
class Sprite;

class Item {
   public:
    static constexpr Uint8 DEFAULT_COLOR1 = 12;  // Color principal por defecto
    static constexpr Uint8 DEFAULT_COLOR2 = 6;   // Color secundario por defecto

    struct Data {
        std::string tile_set_file;      // Ruta al fichero con los gráficos del item
        float x{0.0F};                  // Posición del item en pantalla
        float y{0.0F};                  // Posición del item en pantalla
        int tile{0};                    // Número de tile dentro de la textura
        int counter{0};                 // Contador inicial. Es el que lo hace cambiar de color
        Uint8 color1{DEFAULT_COLOR1};   // Color principal del item (override del default si está en el yaml)
        Uint8 color2{DEFAULT_COLOR2};   // Color secundario del item
        bool color1_overridden{false};  // True si el yaml tenía color1 explícito
        bool color2_overridden{false};  // True si el yaml tenía color2 explícito
    };

    explicit Item(const Data& item);  // Constructor
    ~Item() = default;                // Destructor

    void render() const;            // Pinta el objeto en pantalla
    void update(float delta_time);  // Actualiza las variables del objeto

    void setPaused(bool paused) { is_paused_ = paused; }    // Pausa/despausa el item
    auto getCollider() -> SDL_FRect& { return collider_; }  // Obtiene el rectangulo de colision del objeto
    auto getPos() -> SDL_FPoint;                            // Obtiene su ubicación
#ifdef _DEBUG
    void setPosition(float x, float y);  // Establece la posición del item (para editor)
    void setTile(int tile);              // Cambia el tile del item (para editor)
#endif

   private:
    static constexpr float ITEM_SIZE = 8.0F;               // Tamaño del item en pixels
    static constexpr int TILESET_COLUMNS = 10;             // Columnas en la textura del tileset de items
    static constexpr float COLOR_CHANGE_INTERVAL = 0.06F;  // Intervalo de cambio de color en segundos (4 frames a 66.67fps)

    std::shared_ptr<Sprite> sprite_;  // SSprite del objeto

    // Variables
    std::vector<Uint8> color_;      // Vector con los colores del objeto
    float time_accumulator_{0.0F};  // Acumulador de tiempo para cambio de color
    SDL_FRect collider_{};          // Rectangulo de colisión
    bool is_paused_{false};         // Indica si el item está pausado
};