import './index';
import { expect } from 'chai';
import { PlaySk } from './play-sk';

import {
  setUpElementUnderTest,
  eventPromise,
  noEventPromise,
} from '../../../infra-sk/modules/test_util';
import {
  ModeChangedManuallyEvent,
  ModeChangedManuallyEventDetail,
  MoveToEvent,
  MoveToEventDetail,
} from '../events';

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<ModeChangedManuallyEventDetail>
      >(ModeChangedManuallyEvent, delay);
      const promise2 = eventPromise<CustomEvent<MoveToEventDetail>>(
        MoveToEvent,
        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<ModeChangedManuallyEventDetail>
      >(ModeChangedManuallyEvent, delay);
      const promise2 = eventPromise<CustomEvent<MoveToEventDetail>>(
        MoveToEvent,
        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<MoveToEventDetail>>(MoveToEvent, 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(MoveToEvent, delay);
      ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, 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<MoveToEventDetail>>(
        MoveToEvent,
        delay
      );
      play.mode = 'play';
      await ep;
      // now in state 1 indefinitely.
      play.mode = 'pause';
      await noEventPromise(MoveToEvent, 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<MoveToEventDetail>>(
        MoveToEvent,
        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(MoveToEvent, delay);
    });

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