const { Menu } = require('electron');

module.exports = class ContextMenu {
  constructor(template, atomWindow) {
    this.atomWindow = atomWindow;
    this.createClickHandlers(template);
    const menu = Menu.buildFromTemplate(template);
    menu.popup(this.atomWindow.browserWindow, { async: true });
  }

  // It's necessary to build the event handlers in this process, otherwise
  // closures are dragged across processes and failed to be garbage collected
  // appropriately.
  createClickHandlers(template) {
    template.forEach(item => {
      if (item.command) {
        if (!item.commandDetail) item.commandDetail = {};
        item.commandDetail.contextCommand = true;
        item.commandDetail.atomWindow = this.atomWindow;
        item.click = () => {
          global.atomApplication.sendCommandToWindow(
            item.command,
            this.atomWindow,
            item.commandDetail
          );
        };
      } else if (item.submenu) {
        this.createClickHandlers(item.submenu);
      }
    });
  }
};
