#pragma once

#include <memory>            // Para unique_ptr, shared_ptr
#include <string>            // Para string
#include <vector>            // Para vector
#include "animated_sprite.h" // Para AnimatedSprite

class Texture;

// Estructura para almacenar la información de una textura de explosión
struct ExplosionTexture
{
    int size;                           // Tamaño de la explosión
    std::shared_ptr<Texture> texture;   // Textura para la explosión
    std::vector<std::string> animation; // Animación para la textura

    ExplosionTexture(int sz, std::shared_ptr<Texture> tex, const std::vector<std::string> &anim)
        : size(sz), texture(tex), animation(anim) {}
};

// Clase Explosions
class Explosions
{
public:
    // Constructor y destructor
    Explosions() = default;
    ~Explosions() = default;

    // Actualiza la lógica de la clase
    void update();

    // Dibuja el objeto en pantalla
    void render();

    // Añade texturas al objeto
    void addTexture(int size, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation);

    // Añade una explosión
    void add(int x, int y, int size);

private:
    // Vector con las texturas a utilizar
    std::vector<ExplosionTexture> textures_;

    // Lista con todas las explosiones
    std::vector<std::unique_ptr<AnimatedSprite>> explosions_;

    // Vacia el vector de elementos finalizados
    void freeExplosions();

    // Busca una textura a partir del tamaño
    int getIndexBySize(int size);
};