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

  Polymer({
    is: 'gr-alert',
    _legacyUndefinedCheck: true,

    /**
     * Fired when the action button is pressed.
     *
     * @event action
     */

    properties: {
      text: String,
      actionText: String,
      shown: {
        type: Boolean,
        value: true,
        readOnly: true,
        reflectToAttribute: true,
      },
      toast: {
        type: Boolean,
        value: true,
        reflectToAttribute: true,
      },

      _hideActionButton: Boolean,
      _boundTransitionEndHandler: {
        type: Function,
        value() { return this._handleTransitionEnd.bind(this); },
      },
      _actionCallback: Function,
    },

    attached() {
      this.addEventListener('transitionend', this._boundTransitionEndHandler);
    },

    detached() {
      this.removeEventListener('transitionend',
          this._boundTransitionEndHandler);
    },

    show(text, opt_actionText, opt_actionCallback) {
      this.text = text;
      this.actionText = opt_actionText;
      this._hideActionButton = !opt_actionText;
      this._actionCallback = opt_actionCallback;
      Gerrit.getRootElement().appendChild(this);
      this._setShown(true);
    },

    hide() {
      this._setShown(false);
      if (this._hasZeroTransitionDuration()) {
        Gerrit.getRootElement().removeChild(this);
      }
    },

    _hasZeroTransitionDuration() {
      const style = window.getComputedStyle(this);
      // transitionDuration is always given in seconds.
      const duration = Math.round(parseFloat(style.transitionDuration) * 100);
      return duration === 0;
    },

    _handleTransitionEnd(e) {
      if (this.shown) { return; }

      Gerrit.getRootElement().removeChild(this);
    },

    _handleActionTap(e) {
      e.preventDefault();
      if (this._actionCallback) { this._actionCallback(); }
    },
  });
})();
