#pragma once

#include <SDL3/SDL.h>

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

struct ItemData {
        std::string tile_set_file;  // Ruta al fichero con los gráficos del item
        float x{0};                 // Posición del item en pantalla
        float y{0};                 // 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{};             // Uno de los dos colores que se utiliza para el item
        Uint8 color2{};             // Uno de los dos colores que se utiliza para el item

        // Constructor
        ItemData() = default;
};

class Item {
    private:
        // Constantes
        static constexpr float ITEM_SIZE = 8;

        // Objetos y punteros
        std::shared_ptr<SurfaceSprite> sprite_;  // SSprite del objeto

        // Variables
        std::vector<Uint8> color_;  // Vector con los colores del objeto
        int counter_;               // Contador interno
        SDL_FRect collider_;        // Rectangulo de colisión
        int change_color_speed_;    // Cuanto mas alto, mas tarda en cambiar de color

    public:
        // Constructor
        explicit Item(const ItemData &item);

        // Destructor
        ~Item() = default;

        // Pinta el objeto en pantalla
        void render() const;

        // Actualiza las variables del objeto
        void update() { counter_++; }

        // Obtiene el rectangulo de colision del objeto
        auto getCollider() -> SDL_FRect& { return collider_; }

        // Obtiene su ubicación
        auto getPos() -> SDL_FPoint;

        // Asigna los colores del objeto
        void setColors(Uint8 col1, Uint8 col2);
};