import './index';
import {
  PlaySk, PlaySkMoveToEventDetail, PlaySkModeChangedManuallyEventDetail
} from './play-sk';

import {
  setUpElementUnderTest, eventPromise, noEventPromise
} from '../../../infra-sk/modules/test_util';
import { expect } from 'chai';

describe('play-sk', () => {
  const newInstance = setUpElementUnderTest<PlaySk>('play-sk');

  let play: PlaySk;
  beforeEach(() => {
    play = newInstance((el: PlaySk) => {
      // Put player in well-defined state.
      el.mode = 'pause';
      el.size = 10; // a sequence of 10 items
      el.playbackDelay = 100; // ms
      el.movedTo(3); // start on item 3
    });
  });
  // Number of ms to wait for moveto events to be produced.
  // must exceed el.playbackDelay above, but not by too much.
  const delay = 120;

  describe('Events', () => {

    it('Starts playing when play button clicked', async () => {
      const promise1 = eventPromise<CustomEvent<PlaySkModeChangedManuallyEventDetail>>(
        'mode-changed-manually', delay);
      const promise2 = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      // rather than setting play.mode, click the play icon.
      (document.getElementById('play-button') as HTMLElement).click();

      expect((await promise1).detail.mode).to.equal('play');
      expect((await promise2).detail.item).to.equal(4);
    });

    it('No stack overflow when delay is 0', async () => {
      play.playbackDelay = 0;
      const promise1 = eventPromise<CustomEvent<PlaySkModeChangedManuallyEventDetail>>(
        'mode-changed-manually', delay);
      const promise2 = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      // rather than setting play.mode, click the play icon.
      (document.getElementById('play-button') as HTMLElement).click();

      expect((await promise1).detail.mode).to.equal('play');
      expect((await promise2).detail.item).to.equal(4);
    });

    it('emits moveto when playing', async () => {
      let ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.mode = 'play';
      expect((await ep).detail.item).to.equal(4);
      // Expect it doesn't happen again, because we haven't called movedTo yet.
      await noEventPromise('moveto', delay);
      ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.movedTo(4);
      // now expect it asks to play the next thing in 100 ms.
      expect((await ep).detail.item).to.equal(5);
    });

    // State 1 being right after it emits moveto, but before the app calls movedTo
    it('Does not emit moveto after paused in state 1', async () => {
      const ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.mode = 'play';
      await ep;
      // now in state 1 indefinitely.
      play.mode = 'pause';
      await noEventPromise('moveto', delay);
    });

    // State 2 being right after the app calls movedTo but it's sitting out it's internal
    // delay.
    it('Does not emit moveto after paused in state 2', async () => {
      const ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.mode = 'play';
      const item = (await ep).detail.item;
      play.movedTo(item);
      // now in state 2 for 100 ms.
      play.mode = 'pause';
      await noEventPromise('moveto', delay);
    });

    it('Continues after skipping to an arbitrary position while playing in state 1',
        async () => {
      let ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.mode = 'play';
      await ep;
      ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.movedTo(8);
      // expect it to emit moveto 9
      expect((await ep).detail.item).to.equal(9);
    });

    it('Continues after skipping to an arbitrary position while playing in state 2',
        async () => {
      let ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.mode = 'play';
      const item = (await ep).detail.item;
      play.movedTo(item);
      // now in state 2 for 100 ms
      ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.movedTo(8);
      // expect it to emit moveto 9
      expect((await ep).detail.item).to.equal(9);
    });

    it('Plays after skipping to an arbitrary position while paused', async () => {
      play.mode = 'pause';
      play.movedTo(8);
      // expect jumps don't start playback
      await noEventPromise('moveto', delay);
      // expect it to emit moveto 9
      const ep = eventPromise<CustomEvent<PlaySkMoveToEventDetail>>('moveto', delay);
      play.mode = 'play'
      expect((await ep).detail.item).to.equal(9);
    });

  });
});
