/**
 * @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.DisplayNameMixin
    * @appliesMixin Gerrit.TooltipMixin
    */
  class GrAccountLabel extends Polymer.mixinBehaviors( [
    Gerrit.DisplayNameBehavior,
    Gerrit.TooltipBehavior,
  ], Polymer.GestureEventListeners(
      Polymer.LegacyElementMixin(
          Polymer.Element))) {
    static get is() { return 'gr-account-label'; }

    static get properties() {
      return {
      /**
       * @type {{ name: string, status: string }}
       */
        account: Object,
        avatarImageSize: {
          type: Number,
          value: 32,
        },
        title: {
          type: String,
          reflectToAttribute: true,
          computed: '_computeAccountTitle(account, additionalText)',
        },
        additionalText: String,
        hasTooltip: {
          type: Boolean,
          reflectToAttribute: true,
          computed: '_computeHasTooltip(account)',
        },
        hideAvatar: {
          type: Boolean,
          value: false,
        },
        _serverConfig: {
          type: Object,
          value: null,
        },
      };
    }

    ready() {
      super.ready();
      if (!this.additionalText) { this.additionalText = ''; }
      this.$.restAPI.getConfig()
          .then(config => { this._serverConfig = config; });
    }

    _computeName(account, config) {
      return this.getUserName(config, account, false);
    }

    _computeStatusTextLength(account, config) {
      // 35 as the max length of the name + status
      return Math.max(10, 35 - this._computeName(account, config).length);
    }

    _computeAccountTitle(account, tooltip) {
      // Polymer 2: check for undefined
      if ([
        account,
        tooltip,
      ].some(arg => arg === undefined)) {
        return undefined;
      }

      if (!account) { return; }
      let result = '';
      if (this._computeName(account, this._serverConfig)) {
        result += this._computeName(account, this._serverConfig);
      }
      if (account.email) {
        result += ` <${account.email}>`;
      }
      if (this.additionalText) {
        result += ` ${this.additionalText}`;
      }

      // Show status in the label tooltip instead of
      // in a separate tooltip on status
      if (account.status) {
        result += ` (${account.status})`;
      }

      return result;
    }

    _computeShowEmailClass(account) {
      if (!account || account.name || !account.email) { return ''; }
      return 'showEmail';
    }

    _computeEmailStr(account) {
      if (!account || !account.email) {
        return '';
      }
      if (account.name) {
        return '(' + account.email + ')';
      }
      return account.email;
    }

    _computeHasTooltip(account) {
      // If an account has loaded to fire this method, then set to true.
      return !!account;
    }
  }

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