#include "item_manager.hpp"

#include "core/audio/audio.hpp"    // Para Audio
#include "game/entities/item.hpp"  // Para Item
#include "game/options.hpp"        // Para Options
#include "item_tracker.hpp"        // Para ItemTracker
#include "scoreboard.hpp"          // Para Scoreboard::Data
#include "utils/utils.hpp"         // Para checkCollision

// Constructor
ItemManager::ItemManager(std::string room_name, std::shared_ptr<Scoreboard::Data> scoreboard_data)
    : room_name_(std::move(room_name)),
      data_(std::move(scoreboard_data)) {
}

// Añade un item a la colección
void ItemManager::addItem(std::shared_ptr<Item> item) {
    items_.push_back(std::move(item));
}

// Elimina todos los items
void ItemManager::clear() {
    items_.clear();
}

// Actualiza todos los items
void ItemManager::update(float delta_time) {
    for (const auto& item : items_) {
        item->update(delta_time);
    }
}

// Renderiza todos los items
void ItemManager::render() {
    for (const auto& item : items_) {
        item->render();
    }
}

// Pausa/despausa todos los items
void ItemManager::setPaused(bool paused) {
    for (const auto& item : items_) {
        item->setPaused(paused);
    }
}

// Comprueba si hay colisión con algún item
auto ItemManager::checkCollision(SDL_FRect& rect) -> bool {
    for (int i = 0; i < static_cast<int>(items_.size()); ++i) {
        if (::checkCollision(rect, items_.at(i)->getCollider())) {
            // Registra el item como recogido
            ItemTracker::get()->addItem(room_name_, items_.at(i)->getPos());

            // Elimina el item de la colección
            items_.erase(items_.begin() + i);

            // Reproduce el sonido de pickup
            Audio::get()->playSound("item.wav", Audio::Group::GAME);

            // Actualiza el scoreboard y estadísticas
            data_->items++;
            Options::stats.items = data_->items;

            return true;
        }
    }

    return false;
}
