#include "lel.hpp"
#include <catch2/catch_test_macros.hpp>
#include <fmt/core.h>
#include <string>

TEST_CASE("test basic ops", "[lel]") {
  lel::Parser parser(0, 0, 500, 500);

  bool good = parser.parse(
     "[ label_1         | label3      | test1]"
     "[ *(300,300)text1 | %(150)people | ^test2]"
     "[ >label2         | _           | .test3]"
     "[ =message        | buttons     | test4]");

  REQUIRE(good);

  for(size_t rowcount = 0; rowcount < parser.grid.size(); rowcount++) {
    auto& row = parser.grid[rowcount];

    for(size_t colcount = 0; colcount < row.size(); colcount++) {
      auto &name = row[colcount];
      if(name == "_") {
        REQUIRE(!parser.cells.contains(name));
      } else {
        auto &cell = parser.cells.at(name);
        REQUIRE(cell.row == int(rowcount));
        REQUIRE(cell.col == int(colcount));
      }
    }
  }

  REQUIRE(parser.cells.size() == 11);
  REQUIRE(parser.cells.at("label2").right == true);
  REQUIRE(parser.cells.at("text1").expand == true);
  REQUIRE(parser.cells.at("text1").w == 300);
  REQUIRE(parser.cells.at("text1").h == 300);
  REQUIRE(parser.cells.at("people").expand == false);
  REQUIRE(parser.cells.at("message").expand == false);
  REQUIRE(parser.cells.at("message").center == true);

  for(auto& [name, cell] : parser.cells) {
    REQUIRE(cell.w > 0);
    REQUIRE(cell.h > 0);
  }

  auto hit = parser.hit(10, 10);
  REQUIRE(*hit == "label_1");

  auto nohit = parser.hit(1000, 1000);
  REQUIRE(!nohit);
  REQUIRE(nohit == std::nullopt);
}