#pragma once

#include <SDL3/SDL.h>

#include <string>  // Para string, basic_string
#include <utility>
#include <vector>  // Para vector

struct ItemTrackerData {
        std::string name;             // Nombre de la habitación donde se encuentra el objeto
        std::vector<SDL_FPoint> pos;  // Lista de objetos cogidos de la habitación

        // Constructor
        ItemTrackerData(std::string name, const SDL_FPoint& position)
            : name(std::move(name)) {
            pos.push_back(position);
        }
};

class ItemTracker {
    private:
        // [SINGLETON] Objeto privado
        static ItemTracker* item_tracker;

        // Variables
        std::vector<ItemTrackerData> item_list_;  // Lista con todos los objetos recogidos

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

        // Busca una entrada en la lista por posición
        auto findByPos(int index, SDL_FPoint pos) -> int;

        // Constructor
        ItemTracker() = default;

        // Destructor
        ~ItemTracker() = default;

    public:
        // [SINGLETON] Crearemos el objeto con esta función estática
        static void init();

        // [SINGLETON] Destruiremos el objeto con esta función estática
        static void destroy();

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

        // Comprueba si el objeto ya ha sido cogido
        auto hasBeenPicked(const std::string& name, SDL_FPoint pos) -> bool;

        // Añade el objeto a la lista de objetos cogidos
        void addItem(const std::string& name, SDL_FPoint pos);
};