#include "gui/fsm.hpp"
#include "textures.hpp"
#include "sound.hpp"
#include "autowalker.hpp"
#include "ai.hpp"
#include "animation.hpp"
#include <iostream>
#include "shaders.hpp"
#include "backend.hpp"

int main(int argc, char* argv[]) {
  try {
    components::init();
    sfml::Backend backend;
    guecs::init(&backend);
    ai::init("assets/ai.json");
    animation::init();

    if(DEBUG_BUILD) sound::mute(true);

    gui::FSM main;
    main.event(gui::Event::STARTED);
    Autowalker walker(main);

    sound::play("ambient_1", true);

    if(argc > 1 && argv[1][0] == 't') {
      walker.start_autowalk();
    }

    while(main.active()) {
      main.render();

      // BUG: need to sort out how to deal with this in the FSM
      if(main.in_state(gui::State::IDLE)
          || main.in_state(gui::State::NEXT_LEVEL)
          || main.in_state(gui::State::LOOTING)
          || main.in_state(gui::State::IN_COMBAT))
      {
        if(main.autowalking) {
          walker.autowalk();
        } else {
          main.handle_keyboard_mouse();
        }
      } else{
        main.event(gui::Event::TICK);
      }

      main.handle_world_events();
    }

    return 0;
  } catch(const std::system_error& e) {
    std::cout << "WARNING: On OSX you'll get this error on shutdown.\n";
    std::cout << "Caught system_error with code "
                 "[" << e.code() << "] meaning "
                 "[" << e.what() << "]\n";
  }
}
