#include "key_manager.hpp"

#include <utility>  // Para std::move

#include "core/audio/audio.hpp"           // Para Audio
#include "game/defaults.hpp"              // Para Defaults::Sound::Files
#include "game/entities/key.hpp"          // Para Key
#include "game/gameplay/inventory.hpp"    // Para Inventory
#include "game/gameplay/key_tracker.hpp"  // Para KeyTracker
#include "utils/utils.hpp"                // Para checkCollision

// Constructor
KeyManager::KeyManager(std::string room_id)
    : room_id_(std::move(room_id)) {
}

// Añade una llave a la colección
void KeyManager::addKey(std::shared_ptr<Key> key) {  // NOLINT(readability-identifier-naming)
    keys_.push_back(std::move(key));
}

// Elimina todas las llaves
void KeyManager::clear() {
    keys_.clear();
}

// Actualiza todas las llaves
void KeyManager::update(float delta_time) {
    for (const auto& key : keys_) {
        key->update(delta_time);
    }
}

// Renderiza todas las llaves
void KeyManager::render() {
    for (const auto& key : keys_) {
        key->render();
    }
}

// Pausa/despausa todas las llaves
void KeyManager::setPaused(bool paused) {
    for (const auto& key : keys_) {
        key->setPaused(paused);
    }
}

// Comprueba si hay colisión con alguna llave
auto KeyManager::checkCollision(SDL_FRect& rect) -> bool {
    for (int i = 0; i < static_cast<int>(keys_.size()); ++i) {
        if (::checkCollision(rect, keys_.at(i)->getCollider())) {
            // Añade el id de la llave al Inventory global
            Inventory::get()->addKey(keys_.at(i)->getId());

            // Registra la posición en KeyTracker (para no respawnear)
            KeyTracker::get()->addKey(room_id_, keys_.at(i)->getPos());

            // Elimina la llave de la colección
            keys_.erase(keys_.begin() + i);

            // Reproduce el sonido de pickup (reutiliza el sonido de item)
            Audio::get()->playSound(Defaults::Sound::Files::ITEM, Audio::Group::GAME);

            return true;
        }
    }

    return false;
}
