/**
 * @license
 * Copyright 2017 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import './gr-js-api-interface';
import {GrPluginActionContext} from './gr-plugin-action-context';
import {addListenerForTest, waitEventLoop} from '../../../test/test-utils';
import {assert} from '@open-wc/testing';
import {PluginApi} from '../../../api/plugin';
import {SinonStub, spy, stub} from 'sinon';
import {PopupPluginApi} from '../../../api/popup';
import {GrButton} from '../gr-button/gr-button';
import {createChange, createRevision} from '../../../test/test-data-generators';
import {ActionType} from '../../../api/change-actions';
import {HttpMethod} from '../../../api/rest-api';
import {RestPluginApi} from '../../../api/rest';

suite('gr-plugin-action-context tests', () => {
  let instance: GrPluginActionContext;

  let plugin: PluginApi;

  setup(() => {
    window.Gerrit.install(
      p => {
        plugin = p;
      },
      '0.1',
      'http://test.com/plugins/testplugin/static/test.js'
    );
    instance = new GrPluginActionContext(
      plugin,
      {
        label: 'MyAction',
        method: HttpMethod.POST,
        __key: 'key',
        __url: '/changes/1/revisions/2/foo~bar',
        __type: ActionType.REVISION,
      },
      createChange(),
      createRevision()
    );
  });

  test('popup() and hide()', async () => {
    const popupApiStub = {
      _getElement: stub().returns(document.createElement('div')),
      close: stub(),
    } as PopupPluginApi & {_getElement: SinonStub; close: SinonStub};
    stub(plugin, 'popup').resolves(popupApiStub);
    const el = document.createElement('span');
    instance.popup(el);
    await waitEventLoop();
    assert.isTrue(popupApiStub._getElement.called);
    instance.hide();
    assert.isTrue(popupApiStub.close.called);
  });

  test('textfield', () => {
    assert.equal(instance.textfield().tagName, 'MD-OUTLINED-TEXT-FIELD');
  });

  test('br', () => {
    assert.equal(instance.br().tagName, 'BR');
  });

  test('msg', () => {
    const el = instance.msg('foobar');
    assert.equal(el.tagName, 'GR-LABEL');
    assert.equal(el.textContent, 'foobar');
  });

  test('div', () => {
    const el1 = document.createElement('span');
    el1.textContent = 'foo';
    const el2 = document.createElement('div');
    el2.textContent = 'bar';
    const div = instance.div(el1, el2);
    assert.equal(div.tagName, 'DIV');
    assert.equal(div.textContent, 'foobar');
  });

  suite('button', () => {
    let clickStub: SinonStub;
    let button: GrButton;
    setup(() => {
      clickStub = stub();
      button = instance.button('foo', {onclick: clickStub});
      document.body.appendChild(button);
    });

    test('click', async () => {
      button.click();
      await waitEventLoop();
      assert.isTrue(clickStub.called);
      assert.equal(button.textContent, 'foo');
    });

    teardown(() => {
      button.remove();
    });
  });

  test('checkbox', () => {
    const el = instance.checkbox();
    assert.equal(el.tagName, 'INPUT');
    assert.equal(el.type, 'checkbox');
  });

  test('label', () => {
    const divSpy = spy(instance, 'div');
    const fakeMsg = document.createElement('gr-label');
    const fakeCheckbox = document.createElement('input');
    stub(instance, 'msg').returns(fakeMsg);

    instance.label(fakeCheckbox, 'foo');

    assert.isTrue(divSpy.calledWithExactly(fakeCheckbox, fakeMsg));
  });

  test('call', () => {
    const fakeRestApi = {
      send: stub().resolves(),
    } as RestPluginApi & {send: SinonStub};
    stub(plugin, 'restApi').returns(fakeRestApi);

    const payload = {foo: 'foo'};
    instance.call(payload, () => {});

    assert.isTrue(
      fakeRestApi.send.calledWith(
        HttpMethod.POST,
        '/changes/1/revisions/2/foo~bar',
        payload
      )
    );
  });

  test('call error', async () => {
    const fakeRestApi = {
      send: () => Promise.reject(new Error('boom')),
    } as unknown as RestPluginApi;
    stub(plugin, 'restApi').returns(fakeRestApi);
    const errorStub = stub();
    addListenerForTest(document, 'show-alert', errorStub);

    instance.call({}, () => {});
    await waitEventLoop();

    assert.isTrue(errorStub.calledOnce);
    assert.equal(
      errorStub.args[0][0].detail.message,
      'Plugin network error: Error: boom'
    );
  });
});
