/**
 * @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.
 */
import {AccountInfo, GroupInfo, ServerInfo} from '../types/common';
import {DefaultDisplayNameConfig} from '../constants/constants';

const ANONYMOUS_NAME = 'Anonymous';

export function getUserName(config: ServerInfo, account: AccountInfo): string {
  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;
}

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

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

function _accountEmail(email?: string) {
  if (typeof email !== 'undefined') {
    return '<' + email + '>';
  }
  return '';
}

export const _testOnly_accountEmail = _accountEmail;

export function getGroupDisplayName(group: GroupInfo) {
  return group.name + ' (group)';
}
