#pragma once

#include "components.hpp"
#include "map.hpp"
#include "dinkyecs.hpp"
#include <filesystem>
#include <string>
#include <map>

namespace save {
  namespace fs = std::filesystem;

  struct MapData {
    size_t width;
    size_t height;
    std::vector<Room> rooms;
    Matrix walls;
  };

  struct Facts {
    components::Player player;
  };

  struct SaveData {
    Facts facts;
    MapData map;

    std::map<DinkyECS::Entity, components::Position> position;
    std::map<DinkyECS::Entity, components::Motion> motion;
    std::map<DinkyECS::Entity, components::Combat> combat;
    std::map<DinkyECS::Entity, components::Tile> tile;
    // std::map<DinkyECS::Entity, components::Inventory> inventory;
  };

  void to_file(fs::path path, DinkyECS::World &world, Map &map);
  void from_file(fs::path path, DinkyECS::World &world_out, Map &map);
  void load_configs(DinkyECS::World &world);
}