// 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-account-label',

    properties: {
      /**
       * @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,
      },
    },

    behaviors: [
      Gerrit.AnonymousNameBehavior,
      Gerrit.TooltipBehavior,
    ],

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

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

    _computeAccountTitle(account, tooltip) {
      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) {
        return result + ' ' + this.additionalText;
      }
      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;
    },
  });
})();
