#pragma once
#include <set>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>


bool compareById(const GameObject& a, const GameObject& b) {
    return a.id > b.id;
}

std::vector<GameObject> datab;

int is_indb(ObjectId id) {
    for (int i = 0; i < datab.size(); i++) {
        if (datab[i].id == id)
            return i;
    }
    return -1;
}

class GameDatabase {
 public:
    GameDatabase() = default;

    /// вставляет в базу объект с именем [name] и позицией [x, y]
    /// если объект с таким id в базе уже есть, заменяет его новым
    void Insert(ObjectId id, string name, size_t x, size_t y) {
        int idd = is_indb(id);
        if (idd == -1) {
            datab.push_back({ id, name, x, y });
        }
        else {
            datab[idd] = {id, name, x, y};
        }

    }

    /// удаляет элемент по id
    /// если такого элемента нет, ничего не делает
    void Remove(ObjectId id) {
        int idd = is_indb(id);
        if (idd != -1)
            datab.erase(datab.begin() + idd);
    }

    /// возвращает вектор объектов c именем [name]
    /// сортировка по убыванию id
    vector<GameObject> DataByName(string name) const {
        vector<GameObject> v;
        for (auto e : datab)
            if (e.name == name)
                v.push_back(e);
        std::sort(v.begin(), v.end(), compareById);
        return v;
    }

    /// возвращает вектор объектов, находящихся в позиции [x, y]
    /// сортировка по убыванию id
    vector<GameObject> DataByPosition(size_t x, size_t y) const {
        vector<GameObject> v;
        for (auto e : datab)
            if (e.x == x && e.y == y)
                v.push_back(e);
        std::sort(v.begin(), v.end(), compareById);
        return v;
    }

    /// возвращает вектор всех объектов из базы
    /// сортировка по убыванию id
    vector<GameObject> Data() const {
        vector<GameObject> v = datab;
        std::sort(v.begin(), v.end(), compareById);
        return v;
    } 
};