#include "explosions.h"
#include "animated_sprite.h"  // for AnimatedSprite
class Texture;

// Constructor
Explosions::Explosions()
{
    textures.clear();
    explosions.clear();
}

// Destructor
Explosions::~Explosions()
{
    explosions.clear();
}

// 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, std::vector<std::string> *animation)
{
    explosion_texture_t temp;
    temp.size = size;
    temp.texture = texture;
    temp.animation = animation;
    textures.push_back(temp);
}

// Añade una explosión
void Explosions::add(int x, int y, int size)
{
    const int index = getIndexBySize(size);
    auto sprite = std::make_unique<AnimatedSprite>(textures[index].texture, "", textures[index].animation);
    sprite->setPos(x, y);
    explosions.push_back(std::move(sprite));
}

// 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;
}