#pragma once
#include <vector>
#include <algorithm>
#include <string>

class GameDatabase {
 public:
  GameDatabase() = default;

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

  std::vector<GameObject> datab;

  int is_indb(ObjectId id) {
    for (unsigned int i = 0; i < datab.size(); i++) {
      if (datab[i].id == id)
        return i;
    }
    return -1;
  }
  /// вставляет в базу объект с именем [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> base;
    for (auto e: datab)
      if (e.name == name)
        base.push_back(e);
    std::sort(base.begin(), base.end(), compareById);
    return base;
  }

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

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