#include "explosions.h"
#include "animated_sprite.h" // Para AnimatedSprite
class Texture;               // lines 4-4

// Actualiza la lógica de la clase
void Explosions::update()
{
    for (auto &explosion : explosions_)
    {
        explosion->update();
    }

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

// Dibuja el objeto en pantalla
void Explosions::render()
{
    for (auto &explosion : explosions_)
    {
        explosion->render();
    }
}

// Añade texturas al objeto
void Explosions::addTexture(int size, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation)
{
    textures_.emplace_back(ExplosionTexture(size, texture, animation));
}

// Añade una explosión
void Explosions::add(int x, int y, int size)
{
    const auto index = getIndexBySize(size);
    explosions_.emplace_back(std::make_unique<AnimatedSprite>(textures_[index].texture, textures_[index].animation));
    explosions_.back()->setPos(x, y);
}

// Vacia el vector de elementos finalizados
void Explosions::freeExplosions()
{
    if (explosions_.empty() == false)
    {
        for (int i = explosions_.size() - 1; i >= 0; --i)
        {
            if (explosions_[i]->animationIsCompleted())
            {
                explosions_.erase(explosions_.begin() + i);
            }
        }
    }
}

// Busca una textura a partir del tamaño
int Explosions::getIndexBySize(int size)
{
    for (int i = 0; i < (int)textures_.size(); ++i)
    {
        if (size == textures_[i].size)
        {
            return i;
        }
    }

    return 0;
}