#include "gui.hpp"
#include "dinkyecs.hpp"
#include "systems.hpp"
#include "events.hpp"
#include "components.hpp"
#include "dbc.hpp"
#include "collider.hpp"
#include "render.hpp"
#include "save.hpp"
#include "ftxui/screen/terminal.hpp"  // for SetColorSupport, Color, TrueColor

using namespace ftxui;

/*
 * This needs to be turned into a real world generator
 * system.
 */
void configure_world(DinkyECS::World &world, Map &game_map) {
  const auto &config = world.get_the<MapConfig>();
  // this sets up the gui event system
  world.set_the<Events::GUI>(Events::GUI::START);

  // configure a player as a fact of the world
  Player player{world.entity()};
  world.set_the<Player>(player);

  world.set<Position>(player.entity, {game_map.place_entity(0)});
  world.set<Motion>(player.entity, {0, 0});
  world.set<Combat>(player.entity, {100, 10});
  world.set<Tile>(player.entity, {config.PLAYER_TILE});

  auto enemy = world.entity();
  world.set<Position>(enemy, {game_map.place_entity(1)});
  world.set<Motion>(enemy, {0,0});
  world.set<Combat>(enemy, {20, 10});
  world.set<Tile>(enemy, {config.ENEMY_TILE});

  auto enemy2 = world.entity();
  world.set<Position>(enemy2, {game_map.place_entity(2)});
  world.set<Motion>(enemy2, {0,0});
  world.set<Combat>(enemy2, {20, 10});
  world.set<Tile>(enemy2, {"*"});

  auto gold = world.entity();
  world.set<Position>(gold, {game_map.place_entity(game_map.room_count() - 1)});
  world.set<Treasure>(gold, {100});
  world.set<Tile>(gold, {"$"});
}


int main() {
  DinkyECS::World world;

  Map game_map(GAME_MAP_X, GAME_MAP_Y);
  game_map.generate();

  save::load_configs(world);
  configure_world(world, game_map);

  spatial_map collider;
  world.set_the<spatial_map>(collider);
  System::init_positions(world);

  GUI gui(world, game_map);

  return gui.main();
}
