/**
 * @license
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
(function() {
  'use strict';

  const {ShortcutSection} = window.Gerrit.KeyboardShortcutBinder;

  Polymer({
    is: 'gr-keyboard-shortcuts-dialog',

    /**
     * Fired when the user presses the close button.
     *
     * @event close
     */

    properties: {
      _left: Array,
      _right: Array,

      _propertyBySection: {
        type: Object,
        value() {
          return {
            [ShortcutSection.EVERYWHERE]: '_everywhere',
            [ShortcutSection.NAVIGATION]: '_navigation',
            [ShortcutSection.DASHBOARD]: '_dashboard',
            [ShortcutSection.CHANGE_LIST]: '_changeList',
            [ShortcutSection.ACTIONS]: '_actions',
            [ShortcutSection.REPLY_DIALOG]: '_replyDialog',
            [ShortcutSection.FILE_LIST]: '_fileList',
            [ShortcutSection.DIFFS]: '_diffs',
          };
        },
      },
    },

    behaviors: [
      Gerrit.KeyboardShortcutBehavior,
    ],

    hostAttributes: {
      role: 'dialog',
    },

    attached() {
      this.addKeyboardShortcutDirectoryListener(
          this._onDirectoryUpdated.bind(this));
    },

    detached() {
      this.removeKeyboardShortcutDirectoryListener(
          this._onDirectoryUpdated.bind(this));
    },

    _handleCloseTap(e) {
      e.preventDefault();
      this.fire('close', null, {bubbles: false});
    },

    _onDirectoryUpdated(directory) {
      const left = [];
      const right = [];

      if (directory.has(ShortcutSection.EVERYWHERE)) {
        left.push({
          section: ShortcutSection.EVERYWHERE,
          shortcuts: directory.get(ShortcutSection.EVERYWHERE),
        });
      }

      if (directory.has(ShortcutSection.NAVIGATION)) {
        left.push({
          section: ShortcutSection.NAVIGATION,
          shortcuts: directory.get(ShortcutSection.NAVIGATION),
        });
      }

      if (directory.has(ShortcutSection.ACTIONS)) {
        right.push({
          section: ShortcutSection.ACTIONS,
          shortcuts: directory.get(ShortcutSection.ACTIONS),
        });
      }

      if (directory.has(ShortcutSection.REPLY_DIALOG)) {
        right.push({
          section: ShortcutSection.REPLY_DIALOG,
          shortcuts: directory.get(ShortcutSection.REPLY_DIALOG),
        });
      }

      if (directory.has(ShortcutSection.FILE_LIST)) {
        right.push({
          section: ShortcutSection.FILE_LIST,
          shortcuts: directory.get(ShortcutSection.FILE_LIST),
        });
      }

      if (directory.has(ShortcutSection.DIFFS)) {
        right.push({
          section: ShortcutSection.DIFFS,
          shortcuts: directory.get(ShortcutSection.DIFFS),
        });
      }

      this.set('_left', left);
      this.set('_right', right);
    },
  });
})();
