import './index';
import { expect } from 'chai';
import {
  CommandsSk,

} from './commands-sk';

import { setUpElementUnderTest, eventPromise } from '../../../infra-sk/modules/test_util';
import { SkpJsonCommandList } from '../debugger';
import { testData } from './test-data';
import {
  MoveCommandPositionEventDetail,
  SelectImageEventDetail,
  MoveCommandPositionEvent,
  SelectImageEvent,
} from '../events';

describe('commands-sk', () => {
  const newInstance = setUpElementUnderTest<CommandsSk>('commands-sk');

  let commandsSk: CommandsSk;
  beforeEach(() => {
    commandsSk = newInstance();
  });

  it('can process a list of commands', () => {
    commandsSk.processCommands(testData);
    expect(commandsSk.count).to.equal(10);
    // default filter excludes DrawAnnotation, so one less command
    expect(commandsSk.countFiltered).to.equal(9);
    expect(commandsSk.position).to.equal(9); // last item in list
  });

  it('can process a second command list after loading a first', () => {
    commandsSk.processCommands(testData);
    commandsSk.range = [4, 9];

    const newData: SkpJsonCommandList = {
      commands: [
        {
          command: 'DrawRect',
          shortDesc: '',
          key: '',
          imageIndex: 0,
          layerNodeId: 0,
          auditTrail: { Ops: [] },
        },
        {
          command: 'DrawOval',
          shortDesc: '',
          key: '',
          imageIndex: 0,
          layerNodeId: 0,
          auditTrail: { Ops: [] },
        },
        {
          command: 'DrawPaint',
          shortDesc: '',
          key: '',
          imageIndex: 0,
          layerNodeId: 0,
          auditTrail: { Ops: [] },
        },
      ],
    };
    commandsSk.processCommands(newData);
    expect(commandsSk.count).to.equal(3);
    expect(commandsSk.countFiltered).to.equal(3);
    expect(commandsSk.position).to.equal(2);
    // confirm filters gone
    expect(commandsSk.querySelector<HTMLInputElement>('#rangelo')!.value)
      .to.equal('0');
    expect(commandsSk.querySelector<HTMLInputElement>('#rangehi')!.value)
      .to.equal('2'); // the highest index
    expect(commandsSk.querySelector<HTMLInputElement>('#text-filter')!.value)
      .to.equal('!DrawAnnotation'); // We don't intend to clear this.
  });

  it('can apply a range filter by setting range attribute', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.range = [2, 6];

    expect(commandsSk.count).to.equal(10); // this should never change
    expect(commandsSk.countFiltered).to.equal(5);
    expect(commandsSk.position).to.equal(6);
    expect(commandsSk.filtered).to.eql([2, 3, 4, 5, 6]); // chai deep equals
  });

  it('can apply a range filter by clicking the zoom button on one of the ops', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    // a div containing a save op with at matching restore at op 8.
    const opDiv = commandsSk.querySelector<HTMLElement>('#op-4')!;
    // CommandsSk is supposed to find it and remember the range during processCommands.
    // If there is no button, that part failed.
    (opDiv.querySelector('button') as HTMLButtonElement).click();

    expect(commandsSk.countFiltered).to.equal(5);
    expect(commandsSk.position).to.equal(8);
    expect(commandsSk.filtered).to.eql([4, 5, 6, 7, 8]);
  });

  it('can apply a positive text filter (ClipRect cliprrect)', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.textFilter = 'ClipRect cliprrect';

    expect(commandsSk.countFiltered).to.equal(2);
    // the last item to pass the filter, op 5, cliprrect
    expect(commandsSk.position).to.equal(5);
    expect(commandsSk.filtered).to.eql([2, 5]);
  });

  it('can apply a negative text filter (!Restore Save)', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.textFilter = '!Restore Save';

    expect(commandsSk.countFiltered).to.equal(6);
    expect(commandsSk.position).to.equal(7);
    expect(commandsSk.filtered).to.eql([1, 2, 3, 5, 6, 7]);
  });

  // because theres a token that doesn't match a command name, it should be interpreted
  // as a free text search
  it('Can apply a free text search filter (money)', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.textFilter = 'money';

    expect(commandsSk.countFiltered).to.equal(2);
    expect(commandsSk.position).to.equal(8);
    expect(commandsSk.filtered).to.eql([4, 8]);
  });

  it('can apply a range filter while a positive text filter is applied', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.textFilter = 'Save'; // there's save at ops 0 and 4
    commandsSk.range = [2, 9];

    // only one op, the save at position 4, satisfies both filters
    expect(commandsSk.countFiltered).to.equal(1);
    expect(commandsSk.position).to.equal(4);
    expect(commandsSk.filtered).to.eql([4]);
  });

  it('can apply a range filter while a negative text filter is applied', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.textFilter = '!Save'; // there's saves at ops 0 and 4
    commandsSk.range = [2, 9];

    // only one op, the save at position 4, satisfies both filters
    expect(commandsSk.countFiltered).to.equal(7);
    expect(commandsSk.position).to.equal(9);
    expect(commandsSk.filtered).to.eql([2, 3, 5, 6, 7, 8, 9]);
  });

  it('can apply a range filter while a free text filter is applied', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.textFilter = 'trees'; // there's matches at ops 0 and 9
    commandsSk.range = [0, 2];

    expect(commandsSk.countFiltered).to.equal(1);
    expect(commandsSk.position).to.equal(0);
    expect(commandsSk.filtered).to.eql([0]);
  });

  it('can click clear filter button while both types of filter apply.', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.textFilter = 'trees'; // there's matches at ops 0 and 9
    commandsSk.range = [0, 2];

    commandsSk.querySelector<HTMLButtonElement>('#clear-filter-button')!.click();

    // confirm filters gone
    expect(commandsSk.querySelector<HTMLInputElement>('#rangelo')!.value)
      .to.equal('0');
    expect(commandsSk.querySelector<HTMLInputElement>('#rangehi')!.value)
      .to.equal('9'); // the highest index
    expect(commandsSk.querySelector<HTMLInputElement>('#text-filter')!.value)
      .to.equal('');
    // And applied
    expect(commandsSk.countFiltered).to.equal(10);
    // Does not change, also tested below in different circumstances
    expect(commandsSk.position).to.equal(0);
    expect(commandsSk.filtered).to.eql([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  });

  it('can put playback on an arbitrary command by clicking the <summary> element', () => {
    commandsSk.processCommands(testData);

    const opDiv = commandsSk.querySelector<HTMLElement>('#op-5')!; // ClipRRect
    (opDiv.querySelector('summary') as HTMLElement).click();

    expect(commandsSk.countFiltered).to.equal(9);
    expect(commandsSk.position).to.equal(5);
  });

  it('can apply a filter without clobbering selection', () => {
    // Apply a filter that would not exclude the currently selected item and confirm
    // it is still selected.
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    // select item 6, DrawTextBlob
    const opDiv = commandsSk.querySelector<HTMLElement>('#op-6')!; // ClipRRect
    (opDiv.querySelector('summary') as HTMLElement).click();

    commandsSk.textFilter = '!Save Restore';

    expect(commandsSk.position).to.equal(6);
  });

  it('can apply a filter that removes selection and alter it correctly.', () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    // select item 6, DrawTextBlob
    const opDiv = commandsSk.querySelector<HTMLElement>('#op-6')!; // ClipRRect
    (opDiv.querySelector('summary') as HTMLElement).click();

    commandsSk.textFilter = '!DrawTextBlob';

    expect(commandsSk.position).to.equal(9);
  });

  it('playback loops around at the end of a filtered list', async () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(testData);

    commandsSk.range = [4, 9];
    expect(commandsSk.position).to.equal(9);

    // set up event promise
    const ep = eventPromise<CustomEvent<MoveCommandPositionEventDetail>>(
      MoveCommandPositionEvent, 200,
    );

    // click the play button
    commandsSk.querySelector<HTMLButtonElement>('#play-button')!.click();

    expect((await ep).detail.position).to.equal(4);
  });

  it('full op representatoin contains image buttons for image shaders', async () => {
    commandsSk.clearFilter();
    commandsSk.processCommands(JSON.parse(`
{
  "version": 1,
  "commands": [
    {
      "command": "DrawOval",
      "visible": true,
      "coords": [
        0,
        0,
        99,
        99
      ],
      "paint": {
        "antiAlias": true,
        "filterQuality": "low",
        "shader": {
          "name": "SkLocalMatrixShader",
          "data": "/data/1",
          "values": {
            "00_matrix": [
              [
                1.45588,
                0,
                0
              ],
              [
                0,
                1.45588,
                0
              ],
              [
                0,
                0,
                1
              ]
            ],
            "01_SkImageShader": {
              "00_uint": 0,
              "01_uint": 0,
              "02_bool": false,
              "03_matrix": [
                [
                  1,
                  0,
                  0
                ],
                [
                  0,
                  1,
                  0
                ],
                [
                  0,
                  0,
                  1
                ]
              ],
              "04_image": {
                "imageIndex": 1000
              }
            }
          }
        }
      }
    }
  ]
}
      `) as SkpJsonCommandList);
    // Expand the command in this test data, by clicking it two times.
    const opDiv = commandsSk.querySelector<HTMLElement>('#op-0')!;
    const summary = (opDiv.querySelector('summary') as HTMLElement);
    summary.click();
    summary.click();
    // Click the image button. confirm event generated
    const ep = eventPromise<CustomEvent<SelectImageEventDetail>>(
      SelectImageEvent, 200,
    );
      opDiv.querySelector<HTMLButtonElement>('button')!.click();
      expect((await ep).detail.id).to.equal(1000);
  });
});
