// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {assert} from 'chai';
import sinon from 'sinon';

import {MrReactAutocomplete} from './mr-react-autocomplete.tsx';

let element: MrReactAutocomplete;

describe('mr-react-autocomplete', () => {
  beforeEach(() => {
    element = document.createElement('mr-react-autocomplete');
    element.vocabularyName = 'member';
    document.body.appendChild(element);

    sinon.stub(element, 'stateChanged');
  });

  afterEach(() => {
    document.body.removeChild(element);
  });

  it('initializes', () => {
    assert.instanceOf(element, MrReactAutocomplete);
  });

  it('ReactDOM renders on update', async () => {
    element.value = 'Penguin Island';

    await element.updateComplete;

    const input = element.querySelector('input');

    assert.equal(input?.value, 'Penguin Island');
  });

  it('does not update on new copies of the same values', async () => {
    element.fixedValues = ['test'];
    element.value = ['hah'];

    sinon.spy(element, 'updated');

    await element.updateComplete;
    sinon.assert.calledOnce(element.updated);

    element.fixedValues = ['test'];
    element.value = ['hah'];

    await element.updateComplete;
    sinon.assert.calledOnce(element.updated);
  });

  it('_getOptionDescription with component vocabulary gets docstring', () => {
    element.vocabularyName = 'component';
    element._components = new Map([['Infra>UI', {docstring: 'Test docs'}]]);
    element._labels = new Map([['M-84', {docstring: 'Test label docs'}]]);

    assert.equal(element._getOptionDescription('Infra>UI'), 'Test docs');
    assert.equal(element._getOptionDescription('M-84'), '');
    assert.equal(element._getOptionDescription('NoMatch'), '');
  });

  it('_getOptionDescription with label vocabulary gets docstring', () => {
    element.vocabularyName = 'label';
    element._components = new Map([['Infra>UI', {docstring: 'Test docs'}]]);
    element._labels = new Map([['m-84', {docstring: 'Test label docs'}]]);

    assert.equal(element._getOptionDescription('Infra>UI'), '');
    assert.equal(element._getOptionDescription('M-84'), 'Test label docs');
    assert.equal(element._getOptionDescription('NoMatch'), '');
  });

  it('_getOptionDescription with other vocabulary gets empty docstring', () => {
    element.vocabularyName = 'owner';
    element._components = new Map([['Infra>UI', {docstring: 'Test docs'}]]);
    element._labels = new Map([['M-84', {docstring: 'Test label docs'}]]);

    assert.equal(element._getOptionDescription('Infra>UI'), '');
    assert.equal(element._getOptionDescription('M-84'), '');
    assert.equal(element._getOptionDescription('NoMatch'), '');
  });

  it('_options gets component names', () => {
    element.vocabularyName = 'component';
    element._components = new Map([
      ['Infra>UI', {path: 'Infra>UI', docstring: 'Test docs'}],
      ['Bird>Penguin', {path: 'Bird>Penguin', docstring: 'Test docs'}],
    ]);

    assert.deepEqual(element._options(), ['Infra>UI', 'Bird>Penguin']);
  });

  it('_options does not get deprecated components', () => {
    element.vocabularyName = 'component';
    element._components = new Map([
      ['Infra>UI>Deprecated', {path: 'Infra>UI>Deprecated', deprecated: true, docstring: 'Test docs'}],
      ['Infra>UI>NotDeprecated', {path: 'Infra>UI>NotDeprecated', docstring: 'Test docs'}],
    ]);

    assert.deepEqual(element._options(), ['Infra>UI>NotDeprecated']);
  });

  it('_options gets label names', () => {
    element.vocabularyName = 'label';
    element._labels = new Map([
      ['M-84', {label: 'm-84', docstring: 'Test docs'}],
      ['Restrict-View-Bagel', {label: 'restrict-VieW-bAgEl', docstring: 'T'}],
    ]);

    assert.deepEqual(element._options(), ['m-84', 'restrict-VieW-bAgEl']);
  });

  it('_options gets member names with groups', () => {
    element.vocabularyName = 'member';
    element._members = {
      userRefs: [
        {displayName: 'penguin@island.com'},
        {displayName: 'google@monorail.com'},
        {displayName: 'group@birds.com'},
      ],
      groupRefs: [{displayName: 'group@birds.com'}],
    };

    assert.deepEqual(element._options(),
        ['penguin@island.com', 'google@monorail.com', 'group@birds.com']);
  });

  it('_options gets owner names without groups', () => {
    element.vocabularyName = 'owner';
    element._members = {
      userRefs: [
        {displayName: 'penguin@island.com'},
        {displayName: 'google@monorail.com'},
        {displayName: 'group@birds.com'},
      ],
      groupRefs: [{displayName: 'group@birds.com'}],
    };

    assert.deepEqual(element._options(),
        ['penguin@island.com', 'google@monorail.com']);
  });

  it('_options gets owner names without groups', () => {
    element.vocabularyName = 'project';
    element._projects = {
      ownerOf: ['penguins'],
      memberOf: ['birds'],
      contributorTo: ['canary', 'owl-island'],
    };

    assert.deepEqual(element._options(),
        ['penguins', 'birds', 'canary', 'owl-island']);
  });

  it('_options gives empty array for empty vocabulary name', () => {
    element.vocabularyName = '';
    assert.deepEqual(element._options(), []);
  });

  it('_options throws error on unknown vocabulary', () => {
    element.vocabularyName = 'whatever';

    assert.throws(element._options.bind(element),
        'Unknown vocabulary name: whatever');
  });
});
