/**
 * @license
 * Copyright (C) 2019 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(window) {
  'use strict';

  if (window.GrDisplayNameUtils) {
    return;
  }

  const ANONYMOUS_NAME = 'Anonymous';

  class GrDisplayNameUtils {
    static getUserName(config, account) {
      if (account && account.name) {
        return account.name;
      } else if (account && account.username) {
        return account.username;
      } else if (account && account.email) {
        return account.email;
      } else if (config && config.user &&
          config.user.anonymous_coward_name !== 'Anonymous Coward') {
        return config.user.anonymous_coward_name;
      }

      return ANONYMOUS_NAME;
    }

    static getDisplayName(config, account) {
      if (account && account.display_name) {
        return account.display_name;
      }
      if (!account || !account.name || !config || !config.accounts) {
        return this.getUserName(config, account);
      }
      if (config.accounts.default_display_name === 'USERNAME'
          && account.username) {
        return account.username;
      }
      if (config.accounts.default_display_name === 'FIRST_NAME') {
        return account.name.trim().split(' ')[0];
      }
      // Treat every other value as FULL_NAME.
      return account.name;
    }

    static getAccountDisplayName(config, account) {
      const reviewerName = this.getUserName(config, account);
      const reviewerEmail = this._accountEmail(account.email);
      const reviewerStatus = account.status ? '(' + account.status + ')' : '';
      return [reviewerName, reviewerEmail, reviewerStatus]
          .filter(p => p.length > 0).join(' ');
    }

    static _accountEmail(email) {
      if (typeof email !== 'undefined') {
        return '<' + email + '>';
      }
      return '';
    }

    static getGroupDisplayName(group) {
      return group.name + ' (group)';
    }
  }

  window.GrDisplayNameUtils = GrDisplayNameUtils;
})(window);
