text: import { Launcher } from 'comp/launcher';
  import { Keys } from 'const/keys';
  import { AppSettingsModel } from 'models/app-settings-model';
  import { Features } from 'util/features';
  import { StringFormat } from 'util/formatting/string-format';
  
  let allowedKeys;
  
  function getAllowedKeys() {
      if (!allowedKeys) {
          allowedKeys = {};
          for (const [name, code] of Object.entries(Keys)) {
              const keyName = name.replace('DOM_VK_', '');
              if (/^([0-9A-Z]|F\d{1,2})$/.test(keyName)) {
                  allowedKeys[code] = keyName;
              }
          }
      }
      return allowedKeys;
  }
  
  const globalShortcuts = {
      copyPassword: { mac: 'Ctrl+Alt+C', all: 'Shift+Alt+C' },
      copyUser: { mac: 'Ctrl+Alt+B', all: 'Shift+Alt+B' },
      copyUrl: { mac: 'Ctrl+Alt+U', all: 'Shift+Alt+U' },
      copyOtp: {},
      autoType: { mac: 'Ctrl+Alt+T', all: 'Shift+Alt+T' },
      restoreApp: {}
  };
  
  const Shortcuts = {
      keyEventToShortcut(event) {
          const modifiers = [];
          if (event.ctrlKey) {
              modifiers.push('Ctrl');
          }
          if (event.altKey) {
              modifiers.push('Alt');
          }
          if (event.shiftKey) {
              modifiers.push('Shift');
          }
          if (Features.isMac && event.metaKey) {
              modifiers.push('Meta');
          }
          const keyName = getAllowedKeys()[event.which];
          return {
              value: modifiers.join('+') + '+' + (keyName || '…'),
              valid: modifiers.length > 0 && !!keyName
          };
      },
      presentShortcut(shortcutValue, formatting) {
          if (!shortcutValue) {
              return '-';
          }
          return shortcutValue
              .split(/\+/g)
              .map(part => {
                  switch (part) {
                      case 'Ctrl':
                          return this.ctrlShortcutSymbol(formatting);
                      case 'Alt':
                          return this.altShortcutSymbol(formatting);
                      case 'Shift':
                          return this.shiftShortcutSymbol(formatting);
                      case 'Meta':
                          return this.actionShortcutSymbol(formatting);
                      default:
                          return part;
                  }
              })
              .join('');
      },
      actionShortcutSymbol(formatting) {
          return Features.isMac ? '⌘' : formatting ? '<span class="thin">ctrl + </span>' : 'ctrl+';
      },
      altShortcutSymbol(formatting) {
          return Features.isMac ? '⌥' : formatting ? '<span class="thin">alt + </span>' : 'alt+';
      },
      shiftShortcutSymbol(formatting) {
          return Features.isMac ? '⇧' : formatting ? '<span class="thin">shift + </span>' : 'shift+';
      },
      ctrlShortcutSymbol(formatting) {
          return Features.isMac ? '⌃' : formatting ? '<span class="thin">ctrl + </span>' : 'ctrl+';
      },
      globalShortcutText(type, formatting) {
          return this.presentShortcut(this.globalShortcut(type), formatting);
      },
      globalShortcut(type) {
          const appSettingsShortcut = AppSettingsModel[this.globalShortcutAppSettingsKey(type)];
          if (appSettingsShortcut) {
              return appSettingsShortcut;
          }
          const globalShortcut = globalShortcuts[type];
          if (globalShortcut) {
              if (Features.isMac && globalShortcut.mac) {
                  return globalShortcut.mac;
              }
              return globalShortcut.all;
          }
          return undefined;
      },
      setGlobalShortcut(type, value) {
          if (!globalShortcuts[type]) {
              throw new Error('Bad shortcut: ' + type);
          }
          if (value) {
              AppSettingsModel[this.globalShortcutAppSettingsKey(type)] = value;
          } else {
              delete AppSettingsModel[this.globalShortcutAppSettingsKey(type)];
          }
          Launcher.setGlobalShortcuts(AppSettingsModel);
      },
      globalShortcutAppSettingsKey(type) {
          return 'globalShortcut' + StringFormat.capFirst(type);
      },
      screenshotToClipboardShortcut() {
          if (Features.isiOS) {
              return 'Sleep+Home';
          }
          if (Features.isMobile) {
              return '';
          }
          if (Features.isMac) {
              return 'Command-Shift-Control-4';
          }
          if (Features.isWindows) {
              return 'Alt+PrintScreen';
          }
          return '';
      }
  };
  
  export { Shortcuts };
  