#include <catch2/catch_test_macros.hpp>
#include <fmt/core.h>
#include <nlohmann/json.hpp>
#include <fstream>
#include "map.hpp"
#include "worldbuilder.hpp"
#include "lights.hpp"
#include "point.hpp"

using namespace lighting;

TEST_CASE("lighting a map works", "[lighting]") {
  Map map(20,20);
  WorldBuilder builder(map);
  builder.generate();

  Point light1 = map.place_entity(0);
  Point light2 = map.place_entity(1);
  LightSource source1{7,1};
  LightSource source2{3,2};

  LightRender lr(map.width(), map.height());

  lr.reset_light();

  lr.set_light_target(light1);
  lr.set_light_target(light2);

  lr.path_light(map.walls());

  lr.render_light(source1, light1);
  lr.render_light(source2, light2);

  lr.clear_light_target(light1);
  lr.clear_light_target(light2);

  const auto &lighting = lr.lighting();

  // confirm light is set at least at and around the two points
  REQUIRE(lighting[light1.y][light1.x] == lighting::LEVELS[source1.strength]);
  REQUIRE(lighting[light2.y][light2.x] == lighting::LEVELS[source2.strength]);
}
