/**
 * @license
 * Copyright (C) 2018 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.js';
import './gr-label-info.js';
import {isHidden} from '../../../test/test-utils.js';

const basicFixture = fixtureFromElement('gr-label-info');

suite('gr-label-info tests', () => {
  let element;

  setup(() => {
    element = basicFixture.instantiate();

    // Needed to trigger computed bindings.
    element.account = {};
    element.change = {labels: {}};
  });

  suite('remove reviewer votes', () => {
    setup(() => {
      sinon.stub(element, '_computeValueTooltip').returns('');
      element.account = {
        _account_id: 1,
        name: 'bojack',
      };
      const test = {
        all: [{_account_id: 1, name: 'bojack', value: 1}],
        default_value: 0,
        values: [],
      };
      element.change = {
        _number: 42,
        change_id: 'the id',
        actions: [],
        topic: 'the topic',
        status: 'NEW',
        submit_type: 'CHERRY_PICK',
        labels: {test},
        removable_reviewers: [],
      };
      element.labelInfo = test;
      element.label = 'test';

      flush();
    });

    test('_computeCanDeleteVote', () => {
      element.mutable = false;
      const button = element.shadowRoot
          .querySelector('gr-button');
      assert.isTrue(isHidden(button));
      element.change.removable_reviewers = [element.account];
      element.mutable = true;
      assert.isFalse(isHidden(button));
    });

    test('deletes votes', () => {
      const deleteResponse = Promise.resolve({ok: true});
      const deleteStub = sinon.stub(
          element.$.restAPI, 'deleteVote').returns(deleteResponse);

      element.change.removable_reviewers = [element.account];
      element.change.labels.test.recommended = {_account_id: 1};
      element.mutable = true;
      const button = element.shadowRoot
          .querySelector('gr-button');
      MockInteractions.tap(button);
      assert.isTrue(button.disabled);
      return deleteResponse.then(() => {
        assert.isFalse(button.disabled);
        assert.isTrue(deleteStub.calledWithExactly(42, 1, 'test'));
      });
    });
  });

  suite('label color and order', () => {
    test('valueless label rejected', () => {
      element.labelInfo = {rejected: {name: 'someone'}};
      flush();
      const labels = element.root.querySelectorAll('gr-label');
      assert.isTrue(labels[0].classList.contains('negative'));
    });

    test('valueless label approved', () => {
      element.labelInfo = {approved: {name: 'someone'}};
      flush();
      const labels = element.root.querySelectorAll('gr-label');
      assert.isTrue(labels[0].classList.contains('positive'));
    });

    test('-2 to +2', () => {
      element.labelInfo = {
        all: [
          {value: 2, name: 'user 2'},
          {value: 1, name: 'user 1'},
          {value: -1, name: 'user 3'},
          {value: -2, name: 'user 4'},
        ],
        values: {
          '-2': 'Awful',
          '-1': 'Don\'t submit as-is',
          ' 0': 'No score',
          '+1': 'Looks good to me',
          '+2': 'Ready to submit',
        },
      };
      flush();
      const labels = element.root.querySelectorAll('gr-label');
      assert.isTrue(labels[0].classList.contains('max'));
      assert.isTrue(labels[1].classList.contains('positive'));
      assert.isTrue(labels[2].classList.contains('negative'));
      assert.isTrue(labels[3].classList.contains('min'));
    });

    test('-1 to +1', () => {
      element.labelInfo = {
        all: [
          {value: 1, name: 'user 1'},
          {value: -1, name: 'user 2'},
        ],
        values: {
          '-1': 'Don\'t submit as-is',
          ' 0': 'No score',
          '+1': 'Looks good to me',
        },
      };
      flush();
      const labels = element.root.querySelectorAll('gr-label');
      assert.isTrue(labels[0].classList.contains('max'));
      assert.isTrue(labels[1].classList.contains('min'));
    });

    test('0 to +2', () => {
      element.labelInfo = {
        all: [
          {value: 1, name: 'user 2'},
          {value: 2, name: 'user '},
        ],
        values: {
          ' 0': 'Don\'t submit as-is',
          '+1': 'No score',
          '+2': 'Looks good to me',
        },
      };
      flush();
      const labels = element.root.querySelectorAll('gr-label');
      assert.isTrue(labels[0].classList.contains('max'));
      assert.isTrue(labels[1].classList.contains('positive'));
    });

    test('self votes at top', () => {
      element.account = {
        _account_id: 1,
        name: 'bojack',
      };
      element.labelInfo = {
        all: [
          {value: 1, name: 'user 1', _account_id: 2},
          {value: -1, name: 'bojack', _account_id: 1},
        ],
        values: {
          '-1': 'Don\'t submit as-is',
          ' 0': 'No score',
          '+1': 'Looks good to me',
        },
      };
      flush();
      const chips =
          element.root.querySelectorAll('gr-account-link');
      assert.equal(chips[0].account._account_id, element.account._account_id);
    });
  });

  test('_computeValueTooltip', () => {
    // Existing label.
    let labelInfo = {values: {0: 'Baz'}};
    let score = '0';
    assert.equal(element._computeValueTooltip(labelInfo, score), 'Baz');

    // Non-existent score.
    score = '2';
    assert.equal(element._computeValueTooltip(labelInfo, score), '');

    // No values on label.
    labelInfo = {values: {}};
    score = '0';
    assert.equal(element._computeValueTooltip(labelInfo, score), '');
  });

  test('placeholder', () => {
    const values = {
      '0': 'No score',
      '+1': 'good',
      '+2': 'excellent',
      '-1': 'bad',
      '-2': 'terrible',
    };
    element.labelInfo = {};
    assert.isFalse(isHidden(element.shadowRoot
        .querySelector('.placeholder')));
    element.labelInfo = {all: [], values};
    assert.isFalse(isHidden(element.shadowRoot
        .querySelector('.placeholder')));
    element.labelInfo = {all: [{value: 1}], values};
    assert.isTrue(isHidden(element.shadowRoot
        .querySelector('.placeholder')));
    element.labelInfo = {rejected: []};
    assert.isTrue(isHidden(element.shadowRoot
        .querySelector('.placeholder')));
    element.labelInfo = {values: [], rejected: [], all: [{value: 1}, values]};
    assert.isTrue(isHidden(element.shadowRoot
        .querySelector('.placeholder')));
    element.labelInfo = {approved: []};
    assert.isTrue(isHidden(element.shadowRoot
        .querySelector('.placeholder')));
    element.labelInfo = {values: [], approved: [], all: [{value: 1}, values]};
    assert.isTrue(isHidden(element.shadowRoot
        .querySelector('.placeholder')));
  });
});

