#pragma once
#include "raycaster.hpp"
#include "constants.hpp"
#include "stats.hpp"
#include "levelmanager.hpp"
#include "camera.hpp"
#include "fsm.hpp"
#include "render.hpp"
#include "panel.hpp"
#include <ftxui/dom/canvas.hpp>

using ftxui::Canvas;

namespace gui {
  class MapViewUI : public Panel {
    public:
      Canvas $canvas;
      GameLevel $level;

      MapViewUI(GameLevel &level);
      void create_render();
      void resize_canvas();
      void draw_map();
      void update_level(GameLevel &level);
  };


  enum class State {
    START,
    MOVING,
    ATTACKING,
    MAPPING,
    ROTATING,
    IDLE,
    END
  };

  enum class Event {
    STARTED,
    TICK,
    MOVE_FORWARD,
    MOVE_BACK,
    MOVE_LEFT,
    MOVE_RIGHT,
    MAP_OPEN,
    CLOSE,
    ROTATE_LEFT,
    ROTATE_RIGHT,
    ATTACK,
    QUIT
  };

  class FSM : public DeadSimpleFSM<State, Event> {
    public:
      float $rotation = -10.0f;
      Point $player{0,0};
      LevelManager $levels;
      sf::RenderWindow $window;
      SFMLRender $renderer;
      GameLevel $level;
      MapViewUI $map_view;
      CameraLOL $camera;
      sf::Font $font;
      sf::Text $text;
      Stats $stats;
      TexturePack $textures;
      Raycaster $rayview;

      FSM();

      void event(Event ev);

      void START(Event );
      void MOVING(Event );
      void ATTACKING(Event );
      void MAPPING(Event);
      void ROTATING(Event );
      void IDLE(Event ev);
      void END(Event ev);

      void try_move(int dir, bool strafe);
      void keyboard();
      void draw_weapon();
      void draw_gui();
      void render();
      void mouse();
      void generate_map();
      bool active();
      void run_systems();
  };
}
