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

using namespace fmt;
using namespace gui;
using enum gui::routing::Event;
using enum gui::routing::State;

using EventScript = std::vector<routing::Event>;

void run_script(routing::Router& router, routing::State expected, EventScript script) {
  for(auto ev : script) {
    router.event(ev);
  }

  REQUIRE(router.in_state(expected));
}

TEST_CASE("basic router operations test", "[event_router]") {
  routing::Router router;

  // start goes to idle
  run_script(router, IDLE, {
    STARTED
  });

  // simulate drag and drop
  run_script(router, IDLE, {
    MOUSE_DOWN,
    MOUSE_MOVE,
    MOUSE_UP,
    KEY_PRESS
  });

  // moving the mouse outside dnd
  run_script(router, IDLE, {
    MOUSE_MOVE,
    KEY_PRESS,
    MOUSE_MOVE
  });

  // regular mouse click
  run_script(router, IDLE, {
    MOUSE_DOWN,
    MOUSE_UP
  });

  // possible bad key press in a move?
  run_script(router, IDLE, {
    MOUSE_DOWN,
    MOUSE_MOVE,
    KEY_PRESS,
    MOUSE_UP,
  });
}
