/**
 * @provides javelin-behavior-desktop-notifications-control
 * @requires javelin-behavior
 *           javelin-stratcom
 *           javelin-dom
 *           javelin-uri
 *           phabricator-notification
 */

JX.behavior('desktop-notifications-control', function(config, statics) {

  function findEl(id) {
    var el = null;
    try {
      el = JX.$(id);
    } catch (e) {
      // not found
    }
    return el;
  }
  function updateFormStatus(permission) {
    var statusEl = findEl(config.statusID);
    if (!statusEl) {
      return;
    }
    switch (permission) {
      case 'default':
        JX.DOM.setContent(statusEl.firstChild, config.cancelAsk);
        break;
      case 'granted':
        JX.DOM.setContent(statusEl.firstChild, config.grantedAsk);
        break;
      case 'denied':
        JX.DOM.setContent(statusEl.firstChild, config.deniedAsk);
        break;
    }
    JX.DOM.show(statusEl);
  }

  function updateBrowserStatus(permission) {
    var browserStatusEl = findEl(config.browserStatusID);
    if (!browserStatusEl) {
      return;
    }
    switch (permission) {
      case 'default':
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', true);
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false);
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false);
        JX.DOM.setContent(browserStatusEl, JX.$H(config.defaultStatus));
        break;
      case 'granted':
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', true);
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false);
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false);
        JX.DOM.setContent(browserStatusEl, JX.$H(config.grantedStatus));
        break;
      case 'denied':
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', true);
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false);
        JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false);
        JX.DOM.setContent(browserStatusEl, JX.$H(config.deniedStatus));
        break;
    }
    JX.DOM.show(browserStatusEl);
  }

  function installSelectListener() {
    var controlEl = findEl(config.controlID);
    if (!controlEl) {
      return;
    }
    var select = JX.DOM.find(controlEl, 'select');
    JX.DOM.listen(
      select,
      'change',
      null,
      function (e) {
        if (!JX.Notification.supportsDesktopNotifications()) {
          return;
        }
        var value = e.getTarget().value;
        if (value == config.desktopMode) {
          window.Notification.requestPermission(
            function (permission) {
              updateFormStatus(permission);
              updateBrowserStatus(permission);
            });
        } else {
          var statusEl = JX.$(config.statusID);
          JX.DOM.hide(statusEl);
        }
      });
  }

  function install() {
    JX.Stratcom.listen(
      'click',
      'desktop-notifications-permission-button',
        function () {
          window.Notification.requestPermission(
            function (permission) {
              updateFormStatus(permission);
              updateBrowserStatus(permission);
            });
        });

    return true;
  }

  statics.installed = statics.installed || install();
  if (!JX.Notification.supportsDesktopNotifications()) {
    var statusEl = JX.$(config.statusID);
    JX.DOM.setContent(statusEl.firstChild, config.noSupport);
    JX.DOM.show(statusEl);
  } else {
    updateBrowserStatus(window.Notification.permission);
  }
  installSelectListener();
});