/**
 * @license
 * Copyright 2016 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import * as sinon from 'sinon';
import '../../../test/common-test-setup';
import './gr-dialog';
import {GrDialog} from './gr-dialog';
import {
  pressKey,
  queryAndAssert,
  waitEventLoop,
} from '../../../test/test-utils';
import {assert, fixture, html} from '@open-wc/testing';
import {GrButton} from '../gr-button/gr-button';

suite('gr-dialog tests', () => {
  let element: GrDialog;

  setup(async () => {
    element = await fixture<GrDialog>(html` <gr-dialog></gr-dialog> `);
    await element.updateComplete;
  });

  test('renders', async () => {
    assert.shadowDom.equal(
      element,
      /* HTML */ `<div class="container">
        <header class="heading-3">
          <slot name="header"> </slot>
        </header>
        <main>
          <div class="overflow-container">
            <slot name="main"> </slot>
          </div>
        </main>
        <footer>
          <slot name="footer"></slot>
          <div class="flex-space"></div>
          <gr-button
            aria-disabled="false"
            id="cancel"
            link=""
            role="button"
            tabindex="0"
          >
            Cancel
          </gr-button>
          <gr-button
            aria-disabled="false"
            id="confirm"
            link=""
            primary=""
            role="button"
            tabindex="0"
            title=""
          >
            Confirm
          </gr-button>
        </footer>
      </div> `
    );
  });

  test('renders with loading state', async () => {
    element.loading = true;
    element.loadingLabel = 'Loading!!';
    await element.updateComplete;
    assert.shadowDom.equal(
      element,
      /* HTML */ `<div class="container">
        <header class="heading-3">
          <slot name="header"> </slot>
        </header>
        <main>
          <div class="overflow-container">
            <slot name="main"> </slot>
          </div>
        </main>
        <footer>
          <span class="loadingSpin" aria-label="Loading!!" role="progressbar">
          </span>
          <span class="loadingLabel"> Loading!! </span>
          <slot name="footer"></slot>
          <div class="flex-space"></div>
          <gr-button
            aria-disabled="false"
            id="cancel"
            link=""
            role="button"
            tabindex="0"
          >
            Cancel
          </gr-button>
          <gr-button
            aria-disabled="false"
            id="confirm"
            link=""
            primary=""
            role="button"
            tabindex="0"
            title=""
          >
            Confirm
          </gr-button>
        </footer>
      </div> `
    );
  });

  test('events', () => {
    const confirm = sinon.stub();
    const cancel = sinon.stub();
    element.addEventListener('confirm', confirm);
    element.addEventListener('cancel', cancel);

    queryAndAssert<GrButton>(element, 'gr-button[primary]').click();
    assert.equal(confirm.callCount, 1);

    queryAndAssert<GrButton>(element, 'gr-button:not([primary])').click();
    assert.equal(cancel.callCount, 1);
  });

  test('confirmOnEnter', async () => {
    element.confirmOnEnter = false;
    await element.updateComplete;
    const handleConfirmStub = sinon.stub(element, '_handleConfirm');
    const handleKeydownSpy = sinon.spy(element, '_handleKeydown');
    pressKey(queryAndAssert(element, 'main'), 'Enter');
    await waitEventLoop();

    assert.isTrue(handleKeydownSpy.called);
    assert.isFalse(handleConfirmStub.called);

    element.confirmOnEnter = true;
    await element.updateComplete;

    pressKey(queryAndAssert(element, 'main'), 'Enter');
    await waitEventLoop();

    assert.isTrue(handleConfirmStub.called);
  });

  test('resetFocus', () => {
    const focusStub = sinon.stub(element.confirmButton!, 'focus');
    element.resetFocus();
    assert.isTrue(focusStub.calledOnce);
  });

  suite('tooltip', () => {
    test('tooltip not added by default', () => {
      assert.isNull(element.confirmButton!.getAttribute('has-tooltip'));
    });

    test('tooltip added if confirm tooltip is passed', async () => {
      element.confirmTooltip = 'confirm tooltip';
      await element.updateComplete;
      assert(element.confirmButton!.getAttribute('has-tooltip'));
    });
  });

  test('empty labels hide buttons and flex-space', async () => {
    assert.isNotNull(element.shadowRoot!.querySelector('#cancel'));
    assert.isNotNull(element.shadowRoot!.querySelector('#confirm'));
    assert.isNotNull(element.shadowRoot!.querySelector('.flex-space'));

    element.cancelLabel = '';
    element.confirmLabel = '';
    await element.updateComplete;

    assert.isNull(element.shadowRoot!.querySelector('#cancel'));
    assert.isNull(element.shadowRoot!.querySelector('#confirm'));
    assert.isNull(element.shadowRoot!.querySelector('.flex-space'));
  });
});
