class Notifications {

  create(notificationId = null, options) {
    // notificationId is optional
    if(typeof notificationId === 'object') {
      options = notificationId;
      notificationId = null;
    }

    return new Promise((res, rej) => {
      // resolve args = notificationId:string 
      chrome.notifications.create(notificationId, options, res);
    });
  }

  update(notificationId, options) {
    return new Promise((res, rej) => {
      // resolve args = wasUpdated:boolean
      chrome.notifications.update(notificationId, options, res);
    });
  }

  clear(notificationId) {
    return new Promise((res, rej) => {
      // resolve args = wasCleared:boolean
      chrome.notifications.clear(notificationId, res);
    });
  }

  getAll() {
    return new Promise((res, rej) => {
      // resolve args = notifications:object
      chrome.notifications.getAll(res);
    });
  }

  getPermissionLevel() {
    return new Promise((res, rej) => {
      // resolve args = level:PermissionLevel (https://developer.chrome.com/apps/notifications#type-PermissionLevel)
      chrome.notifications.getPermissionLevel(res);
    });
  }

  listen(event, notificationId = null, callback) {
    // event = 'onClosed' | 'onClicked' | 'onButtonClicked' | 'onPermissionLevelChanged' | 'onShowSettings'
    // notificationId is optional
    if(typeof notificationId === 'function') {
      callback = notificationId;
      notificationId = null;
    }

    if(event === 'onPermissionLevelChanged' || event === 'onShowSettings') {
      return this._nonNotificationIdListen(event, callback);
    }

    /**
     * https://developer.chrome.com/apps/notifications#events
     * 
     * Resolve args (by event):
     * onClosed = notificationId:string, byUser:boolean
     * onClicked = notificationId:string
     * onButtonClicked = notificationId:string, buttonIndex:integer
     * 
     * onPermissionLevelChanged = level:PermissionLevel (https://developer.chrome.com/apps/notifications#type-PermissionLevel)
     * onShowSettings = (none)
     */

    // This callback relates only to those events that have notificationId arg
    const ListenerCallback = (() => {
      if(notificationId !== null) {
        return (passedNotificationId, ...args) => {
          if(notificationId === passedNotificationId) {
            callback(passedNotificationId, ...args);
          }
        };
      } else {
        return callback;
      }
    })();


    chrome.notifications[event].addListener(ListenerCallback);
  }

  _nonNotificationIdListen(event, callback) {
    chrome.notifications[event].addListener(callback);
  }
}

export default Notifications;
