#pragma once
#include "simplefsm.hpp"
#include <guecs/ui.hpp>
#include "gui/status_ui.hpp"
#include "gui/loot_ui.hpp"
#include "gui/event_router.hpp"

namespace gui {
  enum class DNDState {
    START=100,
    LOOTING=101,
    LOOT_GRAB=102,
    INV_GRAB=103,
    ITEM_PICKUP=104,
    END=105
  };

  class DNDLoot : public DeadSimpleFSM<DNDState, Event> {
    public:
      std::optional<guecs::Entity> $grab_source = std::nullopt;
      std::shared_ptr<sf::Sprite> $grab_sprite = nullptr;
      StatusUI& $status_ui;
      LootUI& $loot_ui;
      sf::RenderWindow& $window;
      routing::Router& $router;

      DNDLoot(StatusUI& status_ui,
          LootUI& loot_ui, sf::RenderWindow& window,
          routing::Router& router);

      bool event(Event ev, std::any data={});

      void START(Event ev);
      void LOOTING(Event ev, std::any data);
      void LOOT_GRAB(Event ev, std::any data);
      void INV_GRAB(Event ev, std::any data);
      void END(Event ev);
      void ITEM_PICKUP(Event ev, std::any data);
      void handle_mouse(Event ev, guecs::UI& gui);
      void mouse_action(bool hover);
      void render();
      sf::Vector2f mouse_position();
  };
}