// Copyright 2019 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 {MrIssueHeader} from './mr-issue-header.js';
import {store, resetState} from 'reducers/base.js';
import * as issueV0 from 'reducers/issueV0.js';
import {ISSUE_EDIT_PERMISSION, ISSUE_DELETE_PERMISSION,
  ISSUE_FLAGSPAM_PERMISSION} from 'shared/consts/permissions.js';

let element;

describe('mr-issue-header', () => {
  beforeEach(() => {
    store.dispatch(resetState());
    element = document.createElement('mr-issue-header');
    document.body.appendChild(element);
  });

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

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

  it('updating issue id changes header', () => {
    store.dispatch({type: issueV0.VIEW_ISSUE,
      issueRef: {localId: 1, projectName: 'test'}});
    store.dispatch({type: issueV0.FETCH_SUCCESS,
      issue: {localId: 1, projectName: 'test', summary: 'test'}});

    assert.deepEqual(element.issue, {localId: 1, projectName: 'test',
      summary: 'test'});
  });

  it('_issueOptions toggles spam', () => {
    element.issuePermissions = [ISSUE_FLAGSPAM_PERMISSION];
    element.issue = {isSpam: false};
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Flag issue as spam'));
    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Un-flag issue as spam'));

    element.issue = {isSpam: true};

    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Flag issue as spam'));
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Un-flag issue as spam'));

    element.issuePermissions = [];

    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Flag issue as spam'));
    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Un-flag issue as spam'));

    element.issue = {isSpam: false};
    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Flag issue as spam'));
    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Un-flag issue as spam'));
  });

  it('_issueOptions toggles convert issue', () => {
    element.issuePermissions = [];
    element.projectTemplates = [];

    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Convert issue template'));

    element.projectTemplates = [{templateName: 'test'}];

    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Convert issue template'));

    element.issuePermissions = [ISSUE_EDIT_PERMISSION];
    element.projectTemplates = [];
    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Convert issue template'));

    element.projectTemplates = [{templateName: 'test'}];
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Convert issue template'));
  });

  it('_issueOptions toggles delete', () => {
    element.issuePermissions = [ISSUE_DELETE_PERMISSION];
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Delete issue'));

    element.issuePermissions = [];

    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Delete issue'));
  });

  it('_issueOptions toggles move and copy', () => {
    element.projectName = '';
    element.issuePermissions = [ISSUE_DELETE_PERMISSION];
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Move issue'));
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Copy issue'));

    element.isRestricted = true;
    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Move issue'));
    assert.isUndefined(findOptionWithText(element._issueOptions,
      'Copy issue'));

    element.projectName = 'Chromium';
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Move issue'));
    assert.isUndefined(findOptionWithText(element._issueOptions,
      'Copy issue'));

    element.projectName = 'Monkeyrail';
    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Move issue'));
    assert.isUndefined(findOptionWithText(element._issueOptions,
      'Copy issue'));

    element.projectName = 'webrtc';
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Move issue'));
    assert.isUndefined(findOptionWithText(element._issueOptions,
      'Copy issue'));

    element.issuePermissions = [];

    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Move issue'));
    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Copy issue'));
  });

  it('_issueOptions toggles edit description', () => {
    element.issuePermissions = [ISSUE_EDIT_PERMISSION];
    assert.isDefined(findOptionWithText(element._issueOptions,
        'Edit issue description'));

    element.issuePermissions = [];

    assert.isUndefined(findOptionWithText(element._issueOptions,
        'Edit issue description'));
  });

  it('markdown toggle renders on enabled projects', async () => {
    element.projectName = 'monkeyrail';

    await element.updateComplete;

    // This looks for how many mr-pref-toggle buttons there are,
    // if there are two then this project also renders on markdown.
    const chopsToggles = element.shadowRoot.querySelectorAll('mr-pref-toggle');
    assert.equal(chopsToggles.length, 2);

  });

  it('markdown toggle does not render on disabled projects', async () => {
    element.projectName = 'moneyrail';

    await element.updateComplete;

    const chopsToggles = element.shadowRoot.querySelectorAll('mr-pref-toggle');
    assert.equal(chopsToggles.length, 1);
  });

  it('markdown toggle is on by default on enabled projects', async () => {
    element.projectName = 'monkeyrail';

    await element.updateComplete;

    const chopsToggles = element.shadowRoot.querySelectorAll('mr-pref-toggle');
    const markdownButton = chopsToggles[1];
    assert.equal("true", markdownButton.getAttribute('initialvalue'));
  });
});

function findOptionWithText(issueOptions, text) {
  return issueOptions.find((option) => option.text === text);
}
