/**
 * @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';

  /**
    * @appliesMixin Gerrit.KeyboardShortcutMixin
    * @appliesMixin Gerrit.TooltipMixin
    */
  class GrButton extends Polymer.mixinBehaviors( [
    Gerrit.KeyboardShortcutBehavior,
    Gerrit.TooltipBehavior,
  ], Polymer.GestureEventListeners(
      Polymer.LegacyElementMixin(
          Polymer.Element))) {
    static get is() { return 'gr-button'; }

    static get properties() {
      return {
        tooltip: String,
        downArrow: {
          type: Boolean,
          reflectToAttribute: true,
        },
        link: {
          type: Boolean,
          value: false,
          reflectToAttribute: true,
        },
        loading: {
          type: Boolean,
          value: false,
          reflectToAttribute: true,
        },
        disabled: {
          type: Boolean,
          observer: '_disabledChanged',
          reflectToAttribute: true,
        },
        noUppercase: {
          type: Boolean,
          value: false,
        },
        _enabledTabindex: {
          type: String,
          value: '0',
        },
      };
    }

    static get observers() {
      return [
        '_computeDisabled(disabled, loading)',
      ];
    }

    created() {
      super.created();
      this.addEventListener('click',
          e => this._handleAction(e));
      this.addEventListener('keydown',
          e => this._handleKeydown(e));
    }

    ready() {
      super.ready();
      this._ensureAttribute('role', 'button');
      this._ensureAttribute('tabindex', '0');
    }

    _handleAction(e) {
      if (this.disabled) {
        e.preventDefault();
        e.stopImmediatePropagation();
      }
    }

    _disabledChanged(disabled) {
      if (disabled) {
        this._enabledTabindex = this.getAttribute('tabindex');
      }
      this.setAttribute('tabindex', disabled ? '-1' : this._enabledTabindex);
      this.updateStyles();
    }

    _computeDisabled(disabled, loading) {
      return disabled || loading;
    }

    _handleKeydown(e) {
      if (this.modifierPressed(e)) { return; }
      e = this.getKeyboardEvent(e);
      // Handle `enter`, `space`.
      if (e.keyCode === 13 || e.keyCode === 32) {
        e.preventDefault();
        e.stopPropagation();
        this.click();
      }
    }
  }

  customElements.define(GrButton.is, GrButton);
})();
