#pragma once

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

namespace save {
  namespace fs = std::filesystem;

  struct MapData {
    std::vector<Room> rooms;
    Matrix input_map;
    Matrix walls;
    int limit;

    DEFINE_SERIALIZABLE(MapData, rooms, input_map, walls);
  };

  struct Facts {
    components::Player player;

    DEFINE_SERIALIZABLE(Facts, 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;

    DEFINE_SERIALIZABLE(SaveData, facts, map, position, motion, combat, tile, 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);
}
