#include "game/gameplay/item_tracker.hpp"

// [SINGLETON]
ItemTracker* ItemTracker::item_tracker = nullptr;

// [SINGLETON] Crearemos el objeto con esta función estática
void ItemTracker::init() {
    ItemTracker::item_tracker = new ItemTracker();
}

// [SINGLETON] Destruiremos el objeto con esta función estática
void ItemTracker::destroy() {
    delete ItemTracker::item_tracker;
}

// [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él
auto ItemTracker::get() -> ItemTracker* {
    return ItemTracker::item_tracker;
}

// Comprueba si el objeto ya ha sido cogido
auto ItemTracker::hasBeenPicked(const std::string& name, SDL_FPoint pos) -> bool {
    // Primero busca si ya hay una entrada con ese nombre
    if (const int INDEX = findByName(name); INDEX != NOT_FOUND) {
        // Luego busca si existe ya una entrada con esa posición
        if (findByPos(INDEX, pos) != NOT_FOUND) {
            return true;
        }
    }

    return false;
}

// Añade el objeto a la lista de objetos cogidos
void ItemTracker::addItem(const std::string& name, SDL_FPoint pos) {
    // Comprueba si el objeto no ha sido recogido con anterioridad
    if (!hasBeenPicked(name, pos)) {
        // Primero busca si ya hay una entrada con ese nombre
        if (const int INDEX = findByName(name); INDEX != NOT_FOUND) {
            items_.at(INDEX).pos.push_back(pos);
        }
        // En caso contrario crea la entrada
        else {
            items_.emplace_back(name, pos);
        }
    }
}

// Busca una entrada en la lista por nombre
auto ItemTracker::findByName(const std::string& name) -> int {
    int i = 0;

    for (const auto& item : items_) {
        if (item.name == name) {
            return i;
        }
        i++;
    }

    return NOT_FOUND;
}

// Busca una entrada en la lista por posición
auto ItemTracker::findByPos(int index, SDL_FPoint pos) -> int {
    int i = 0;

    for (const auto& item : items_[index].pos) {
        if ((item.x == pos.x) && (item.y == pos.y)) {
            return i;
        }
        i++;
    }

    return NOT_FOUND;
}