#ifndef _MODULES_MENU_HPP_
#define _MODULES_MENU_HPP_

#include <mutex>

#include "modules/base.hpp"

namespace modules
{
  struct MenuTreeItem {
    std::string exec;
    std::unique_ptr<drawtypes::Label> label;
  };

  struct MenuTree {
    std::vector<std::unique_ptr<MenuTreeItem>> items;
  };

  DefineModule(MenuModule, StaticModule)
  {
    const char *TAG_LABEL_TOGGLE = "<label:toggle>";
    const char *TAG_MENU = "<menu>";

    const char *EVENT_MENU_OPEN = "menu_open:";
    const char *EVENT_MENU_CLOSE = "menu_close";

    std::mutex output_mtx;
    std::mutex cmd_mtx;

    int current_level = -1;
    std::vector<std::unique_ptr<MenuTree>> levels;

    std::unique_ptr<drawtypes::Label> label_open;
    std::unique_ptr<drawtypes::Label> label_close;

    public:
      MenuModule(const std::string& name);

      std::string get_output() throw(UndefinedFormat);

      bool build(Builder *builder, const std::string& tag);

      bool handle_command(const std::string& cmd);
  };
}

#endif