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


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

class GameDatabase {
 private:
  int Get_Index(ObjectId id) {
    for (unsigned int i = 0; i < db_.size(); i++) {
      if (db_[i].id == id)
        return i;
    }
    return -1;
  }
  std::vector<GameObject> db_;

 public:
  GameDatabase() = default;

  void Insert(ObjectId id, string name, size_t x, size_t y) {
    int new_id = Get_Index(id);
    if (new_id == -1) {
      db_.push_back({ id, name, x, y });
    } else {
      db_[new_id] = {id, name, x, y};
    }
  }

  void Remove(ObjectId id) {
    int new_id = Get_Index(id);
    if (new_id != -1)
      db_.erase(db_.begin() + new_id);
  }

  vector<GameObject> DataByName(string name) const {
    vector<GameObject> v;
    for (auto x : db_)
      if (x.name == name)
        v.push_back(x);
    std::sort(v.begin(), v.end(), compareById);
    return v;
  }

  vector<GameObject> DataByPosition(size_t x, size_t y) const {
    vector<GameObject> v;
    for (auto i : db_)
      if (i.x == x && i.y == y)
        v.push_back(i);
    std::sort(v.begin(), v.end(), compareById);
    return v;
  }

  vector<GameObject> Data() const {
    vector<GameObject> v = db_;
    std::sort(v.begin(), v.end(), compareById);
    return v;
  }
};