#include "game/entities/item.hpp"

#include "core/rendering/sprite/sprite.hpp"   // Para SSprite
#include "core/resources/resource_cache.hpp"  // Para Resource

// Constructor
Item::Item(const Data& item)
    : sprite_(std::make_shared<Sprite>(Resource::Cache::get()->getSurface(item.tile_set_file), item.x, item.y, ITEM_SIZE, ITEM_SIZE)),
      time_accumulator_(static_cast<float>(item.counter) * COLOR_CHANGE_INTERVAL) {
    // Inicia variables
    sprite_->setClip((item.tile % TILESET_COLUMNS) * ITEM_SIZE, (item.tile / TILESET_COLUMNS) * ITEM_SIZE, ITEM_SIZE, ITEM_SIZE);
    collider_ = sprite_->getRect();

    // Inicializa los colores
    color_.push_back(item.color1);
    color_.push_back(item.color1);

    color_.push_back(item.color2);
    color_.push_back(item.color2);
}

// Actualiza las variables del objeto
void Item::update(float delta_time) {
    if (is_paused_) {
        return;
    }

    time_accumulator_ += delta_time;
}

// Pinta el objeto en pantalla
void Item::render() const {
    // Calcula el índice de color basado en el tiempo acumulado
    const int INDEX = static_cast<int>(time_accumulator_ / COLOR_CHANGE_INTERVAL) % static_cast<int>(color_.size());
    sprite_->render(1, color_.at(INDEX));
}

// Obtiene su ubicación
auto Item::getPos() -> SDL_FPoint {
    const SDL_FPoint P = {.x = sprite_->getX(), .y = sprite_->getY()};
    return P;
}

#ifdef _DEBUG
// Establece la posición del item (para editor)
void Item::setPosition(float x, float y) {
    sprite_->setPosition(x, y);
    collider_ = sprite_->getRect();
}
#endif

#ifdef _DEBUG
// Cambia el tile del item (para editor)
void Item::setTile(int tile) {
    sprite_->setClip((tile % TILESET_COLUMNS) * ITEM_SIZE, (tile / TILESET_COLUMNS) * ITEM_SIZE, ITEM_SIZE, ITEM_SIZE);
}
#endif
