const path = require('path');

const { app, Menu, Tray } = require('electron');

let trayContextMenu = null;
let tray = null;

function createTrayIcon(getMainWindow, messages) {
  // A smaller icon is needed on macOS
  const iconSize = process.platform === 'darwin' ? '16' : '256';
  const iconNoNewMessages = path.join(
    __dirname,
    '..',
    'images',
    `icon_${iconSize}.png`
  );

  tray = new Tray(iconNoNewMessages);

  tray.toggleWindowVisibility = () => {
    const mainWindow = getMainWindow();
    if (mainWindow) {
      if (mainWindow.isVisible()) {
        mainWindow.hide();
      } else {
        mainWindow.show();

        // On some versions of GNOME the window may not be on top when restored.
        // This trick should fix it.
        // Thanks to: https://github.com/Enrico204/Whatsapp-Desktop/commit/6b0dc86b64e481b455f8fce9b4d797e86d000dc1
        mainWindow.setAlwaysOnTop(true);
        mainWindow.focus();
        mainWindow.setAlwaysOnTop(false);
      }
    }
    tray.updateContextMenu();
  };

  tray.updateContextMenu = () => {
    const mainWindow = getMainWindow();

    // NOTE: we want to have the show/hide entry available in the tray icon
    // context menu, since the 'click' event may not work on all platforms.
    // For details please refer to:
    // https://github.com/electron/electron/blob/master/docs/api/tray.md.
    trayContextMenu = Menu.buildFromTemplate([
      {
        id: 'toggleWindowVisibility',
        label: messages[mainWindow.isVisible() ? 'hide' : 'show'].message,
        click: tray.toggleWindowVisibility,
      },
      {
        id: 'quit',
        label: messages.quit.message,
        click: app.quit.bind(app),
      },
    ]);

    tray.setContextMenu(trayContextMenu);
  };

  tray.updateIcon = unreadCount => {
    if (unreadCount > 0) {
      const filename = `${String(unreadCount >= 10 ? 10 : unreadCount)}.png`;
      tray.setImage(
        path.join(__dirname, '..', 'images', 'alert', iconSize, filename)
      );
    } else {
      tray.setImage(iconNoNewMessages);
    }
  };

  tray.on('click', tray.toggleWindowVisibility);

  tray.setToolTip(messages.trayTooltip.message);
  tray.updateContextMenu();

  return tray;
}

module.exports = createTrayIcon;
