/**
 * @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 '../../test/common-test-setup-karma';
import {
  GrReviewerSuggestionsProvider,
  SUGGESTIONS_PROVIDERS_USERS_TYPES,
} from './gr-reviewer-suggestions-provider';
import {getAppContext} from '../../services/app-context';
import {stubRestApi} from '../../test/test-utils';
import {
  AccountId,
  AccountInfo,
  ChangeInfo,
  EmailAddress,
  GroupId,
  GroupName,
  NumericChangeId,
} from '../../api/rest-api';
import {SuggestedReviewerInfo} from '../../types/common';
import {createChange, createServerInfo} from '../../test/test-data-generators';

suite('GrReviewerSuggestionsProvider tests', () => {
  let _nextAccountId = 0;
  function makeAccount(opt_status?: string): AccountInfo {
    const accountId = ++_nextAccountId;
    return {
      _account_id: accountId as AccountId,
      name: `name ${accountId}`,
      email: `email ${accountId}` as EmailAddress,
      status: opt_status,
    };
  }
  let _nextAccountId2 = 0;
  function makeAccount2(opt_status?: string): AccountInfo {
    const accountId2 = ++_nextAccountId2;
    return {
      _account_id: accountId2 as AccountId,
      name: `name ${accountId2}`,
      status: opt_status,
    };
  }

  let owner: AccountInfo;
  let existingReviewer1: AccountInfo;
  let existingReviewer2: AccountInfo;
  let suggestion1: SuggestedReviewerInfo;
  let suggestion2: SuggestedReviewerInfo;
  let suggestion3: SuggestedReviewerInfo;
  let provider: GrReviewerSuggestionsProvider;

  let redundantSuggestion1: SuggestedReviewerInfo;
  let redundantSuggestion2: SuggestedReviewerInfo;
  let redundantSuggestion3: SuggestedReviewerInfo;
  let change: ChangeInfo;

  setup(async () => {
    owner = makeAccount();
    existingReviewer1 = makeAccount();
    existingReviewer2 = makeAccount();
    suggestion1 = {account: makeAccount(), count: 1};
    suggestion2 = {account: makeAccount(), count: 1};
    suggestion3 = {
      group: {
        id: 'suggested group id' as GroupId,
        name: 'suggested group' as GroupName,
      },
      count: 1,
    };

    stubRestApi('getConfig').resolves(createServerInfo());

    change = {
      ...createChange(),
      _number: 42 as NumericChangeId,
      owner,
      reviewers: {
        CC: [existingReviewer1],
        REVIEWER: [existingReviewer2],
      },
    };

    await flush();
  });

  suite('allowAnyUser set to false', () => {
    setup(async () => {
      provider = GrReviewerSuggestionsProvider.create(
        getAppContext().restApiService,
        change._number,
        SUGGESTIONS_PROVIDERS_USERS_TYPES.REVIEWER
      );
      await provider.init();
    });
    suite('stubbed values for _getReviewerSuggestions', () => {
      let getChangeSuggestedReviewersStub: sinon.SinonStub;
      setup(() => {
        getChangeSuggestedReviewersStub = stubRestApi(
          'getChangeSuggestedReviewers'
        ).callsFake(() => {
          redundantSuggestion1 = {account: existingReviewer1, count: 1};
          redundantSuggestion2 = {account: existingReviewer2, count: 1};
          redundantSuggestion3 = {account: owner, count: 1};
          return Promise.resolve([
            redundantSuggestion1,
            redundantSuggestion2,
            redundantSuggestion3,
            suggestion1,
            suggestion2,
            suggestion3,
          ]);
        });
      });

      test('makeSuggestionItem formats account or group accordingly', () => {
        let account = makeAccount();
        const account3 = makeAccount2();
        let suggestion = provider.makeSuggestionItem({account, count: 1});
        assert.deepEqual(suggestion, {
          name: `${account.name} <${account.email}>`,
          value: {account, count: 1},
        });

        const group = {name: 'test' as GroupName, id: '5' as GroupId};
        suggestion = provider.makeSuggestionItem({group, count: 1});
        assert.deepEqual(suggestion, {
          name: `${group.name} (group)`,
          value: {group, count: 1},
        });

        suggestion = provider.makeSuggestionItem(account);
        assert.deepEqual(suggestion, {
          name: `${account.name} <${account.email}>`,
          value: {account, count: 1},
        });

        suggestion = provider.makeSuggestionItem({account: {}, count: 1});
        assert.deepEqual(suggestion, {
          name: 'Name of user not set',
          value: {account: {}, count: 1},
        });

        provider.config = {
          ...createServerInfo(),
          user: {
            anonymous_coward_name: 'Anonymous Coward Name',
          },
        };

        suggestion = provider.makeSuggestionItem({account: {}, count: 1});
        assert.deepEqual(suggestion, {
          name: 'Anonymous Coward Name',
          value: {account: {}, count: 1},
        });

        account = makeAccount('OOO');

        suggestion = provider.makeSuggestionItem({account, count: 1});
        assert.deepEqual(suggestion, {
          name: `${account.name} <${account.email}> (OOO)`,
          value: {account, count: 1},
        });

        suggestion = provider.makeSuggestionItem(account);
        assert.deepEqual(suggestion, {
          name: `${account.name} <${account.email}> (OOO)`,
          value: {account, count: 1},
        });

        account3.email = undefined;

        suggestion = provider.makeSuggestionItem(account3);
        assert.deepEqual(suggestion, {
          name: account3.name,
          value: {account: account3, count: 1},
        });
      });

      test('getSuggestions', async () => {
        const reviewers = await provider.getSuggestions('');

        // Default is no filtering.
        assert.equal(reviewers.length, 6);
        assert.deepEqual(reviewers, [
          redundantSuggestion1,
          redundantSuggestion2,
          redundantSuggestion3,
          suggestion1,
          suggestion2,
          suggestion3,
        ]);
      });

      test('getSuggestions short circuits when logged out', () => {
        provider.loggedIn = false;
        return provider.getSuggestions('').then(() => {
          assert.isFalse(getChangeSuggestedReviewersStub.called);
          provider.loggedIn = true;
          return provider.getSuggestions('').then(() => {
            assert.isTrue(getChangeSuggestedReviewersStub.called);
          });
        });
      });
    });

    test('getChangeSuggestedReviewers is used', async () => {
      const suggestReviewerStub = stubRestApi(
        'getChangeSuggestedReviewers'
      ).returns(Promise.resolve([]));
      const suggestAccountStub = stubRestApi('getSuggestedAccounts').returns(
        Promise.resolve([])
      );

      await provider.getSuggestions('');
      assert.isTrue(suggestReviewerStub.calledOnce);
      assert.isTrue(suggestReviewerStub.calledWith(42 as NumericChangeId, ''));
      assert.isFalse(suggestAccountStub.called);
    });
  });

  suite('allowAnyUser set to true', () => {
    setup(async () => {
      provider = GrReviewerSuggestionsProvider.create(
        getAppContext().restApiService,
        change._number,
        SUGGESTIONS_PROVIDERS_USERS_TYPES.ANY
      );
      await provider.init();
    });

    test('getSuggestedAccounts is used', async () => {
      const suggestReviewerStub = stubRestApi(
        'getChangeSuggestedReviewers'
      ).returns(Promise.resolve([]));
      const suggestAccountStub = stubRestApi('getSuggestedAccounts').returns(
        Promise.resolve([])
      );

      await provider.getSuggestions('');
      assert.isFalse(suggestReviewerStub.called);
      assert.isTrue(suggestAccountStub.calledOnce);
      assert.isTrue(suggestAccountStub.calledWith('cansee:42 '));
    });
  });
});
