#pragma once

#include "map.hpp"
#include "dinkyecs.hpp"
#include "components.hpp"

class WorldBuilder {
  public:
  Map& $map;
  components::ComponentMap& $components;

  WorldBuilder(Map &map, components::ComponentMap& components) :
    $map(map),
    $components(components)
  { }

  void partition_map(Room &cur, int depth);
  void make_room(size_t origin_y, size_t origin_x, size_t width, size_t height);
  void add_door(Room &room);
  void set_door(Room &room, int value);
  void place_rooms();
  void tunnel_doors(PointList &holes, Room &src, Room &target);
  void update_door(Point &at, int wall_or_space);
  void stylize_room(int room, string tile_name, float size);
  void generate_rooms();
  void generate_map();

  DinkyECS::Entity configure_entity_in_map(DinkyECS::World &world, nlohmann::json &entity_data, int in_room);
  void place_entities(DinkyECS::World &world);
  void generate(DinkyECS::World &world);
  void random_entity(DinkyECS::World &world, components::GameConfig &config);
  void randomize_entities(DinkyECS::World &world, components::GameConfig &config);
  void place_stairs(DinkyECS::World& world, components::GameConfig& config);
};
