#pragma once

#include <memory>   // Para unique_ptr, shared_ptr
#include <string>   // Para string
#include <utility>  // Para move
#include <vector>   // Para vector

#include "core/rendering/sprite/animated_sprite.hpp"  // Para AnimatedSprite

class Texture;

// --- Estructura ExplosionTexture: almacena 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(std::move(tex)),
          animation(anim) {}
};

// --- Clase Explosions: gestor de explosiones ---
class Explosions {
   public:
    // --- Constructor y destructor ---
    Explosions() = default;   // Constructor por defecto
    ~Explosions() = default;  // Destructor por defecto

    // --- Métodos principales ---
    void update(float delta_time);  // Actualiza la lógica de la clase (time-based)
    void render();                  // Dibuja el objeto en pantalla

    // --- Configuración ---
    void addTexture(int size, const std::shared_ptr<Texture>& texture, const std::vector<std::string>& animation);  // Añade texturas al objeto
    void add(int x, int y, int size);                                                                               // Añade una explosión

   private:
    // --- Variables de estado ---
    std::vector<ExplosionTexture> textures_;                   // Vector con las texturas a utilizar
    std::vector<std::unique_ptr<AnimatedSprite>> explosions_;  // Lista con todas las explosiones

    // --- Métodos internos ---
    void freeExplosions();                 // Vacía el vector de elementos finalizados
    auto getIndexBySize(int size) -> int;  // Busca una textura a partir del tamaño
};