#pragma once

#include <SDL3/SDL.h>

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

class ItemTracker {
   public:
    // Gestión singleton
    static void init();                 // Inicialización
    static void destroy();              // Destrucción
    static auto get() -> ItemTracker*;  // Acceso al singleton

    // Gestión de items
    auto hasBeenPicked(const std::string& name, SDL_FPoint pos) -> bool;  // Comprueba si el objeto ya ha sido cogido
    void addItem(const std::string& name, SDL_FPoint pos);                // Añade el objeto a la lista

   private:
    // Tipos anidados privados
    struct Data {
        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 para facilitar creación con posición inicial
        Data(std::string name, const SDL_FPoint& position)
            : name(std::move(name)) {
            pos.push_back(position);
        }
    };

    // Constantes privadas
    static constexpr int NOT_FOUND = -1;  // Valor de retorno cuando no se encuentra un elemento

    // Constantes singleton
    static ItemTracker* item_tracker;  // [SINGLETON] Objeto privado

    // Métodos privados
    auto findByName(const std::string& name) -> int;   // Busca una entrada en la lista por nombre
    auto findByPos(int index, SDL_FPoint pos) -> int;  // Busca una entrada en la lista por posición

    // Constructor y destructor privados [SINGLETON]
    ItemTracker() = default;
    ~ItemTracker() = default;

    // Variables miembro
    std::vector<Data> items_;  // Lista con todos los objetos recogidos
};