import './index';
import { expect } from 'chai';
import { DebuggerPageSk } from './debugger-page-sk';
import { testData } from '../commands-sk/test-data';
import { CommandsSk } from '../commands-sk/commands-sk';
import { HistogramSk } from '../histogram-sk/histogram-sk';

import { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';

function hasClass(e: HTMLElement, expected: string): boolean {
  const c = e.getAttribute('class');
  if (!c) { return false; }
  return e.classList.contains(expected);
}

describe('debugger-page-sk', () => {
  const newInstance = setUpElementUnderTest<DebuggerPageSk>('debugger-page-sk');

  let debuggerPageSk: DebuggerPageSk;
  beforeEach(() => {
    debuggerPageSk = newInstance((el: DebuggerPageSk) => {});
  });

  // In addition to showing counts, the histogram functions as a way to toggle any
  // command in or out of the filter. is is integrated closely with commandsSk, and
  // that integration is tested here.
  describe('commands-histogram interaction', () => {
    it('can set a negative text filter and it is reflected in the histogram', () => {
      const commandsSk = debuggerPageSk.querySelector<CommandsSk>('commands-sk')!;
      const histogramSk = debuggerPageSk.querySelector<HistogramSk>('histogram-sk')!;

      commandsSk.clearFilter();
      commandsSk.processCommands(testData);
      commandsSk.textFilter = '!Restore Save';

      // expect histogram selection are highlighted correctly
      expect(hasClass(histogramSk.querySelector<HTMLElement>(
        '#hist-row-save',
      )!, 'pinkBackground')).to.equal(true);
      expect(hasClass(histogramSk.querySelector<HTMLElement>(
        '#hist-row-restore',
      )!, 'pinkBackground')).to.equal(true);
      expect(hasClass(histogramSk.querySelector<HTMLElement>(
        '#hist-row-drawannotation',
      )!, 'pinkBackground')).to.equal(false);
      expect(hasClass(histogramSk.querySelector<HTMLElement>(
        '#hist-row-drawimagerect',
      )!, 'pinkBackground')).to.equal(false);
    });

    it('can set a postive text filter and it is reflected in the histogram', () => {
      const commandsSk = debuggerPageSk.querySelector<CommandsSk>('commands-sk')!;
      const histogramSk = debuggerPageSk.querySelector<HistogramSk>('histogram-sk')!;

      commandsSk.clearFilter();
      commandsSk.processCommands(testData);
      commandsSk.textFilter = 'Restore Save';

      // expect histogram selection are highlighted correctly
      expect(hasClass(histogramSk.querySelector<HTMLElement>(
        '#hist-row-save',
      )!, 'pinkBackground')).to.equal(false);
      expect(hasClass(histogramSk.querySelector<HTMLElement>(
        '#hist-row-restore',
      )!, 'pinkBackground')).to.equal(false);
      expect(hasClass(histogramSk.querySelector<HTMLElement>(
        '#hist-row-drawannotation',
      )!, 'pinkBackground')).to.equal(true);
      expect(hasClass(histogramSk.querySelector<HTMLElement>(
        '#hist-row-drawimagerect',
      )!, 'pinkBackground')).to.equal(true);
    });

    it('can click a histogram row and reflect it in the text filter', () => {
      const commandsSk = debuggerPageSk.querySelector<CommandsSk>('commands-sk')!;
      const histogramSk = debuggerPageSk.querySelector<HistogramSk>('histogram-sk')!;

      commandsSk.clearFilter();
      commandsSk.processCommands(testData);

      // expect histogram selection are highlighted correctly
      histogramSk.querySelector<HTMLElement>('#hist-row-save')!.click();

      expect(commandsSk.querySelector<HTMLInputElement>(
        '#text-filter',
      )!.value).to.equal('!save');
    });
  });
});
