import './index';

import { expect } from 'chai';
import { ParamSet } from '../../../infra-sk/modules/query';
import { setUpElementUnderTest, eventPromise, noEventPromise } from '../../../infra-sk/modules/test_util';
import { FilterDialogSk, Filters } from './filter-dialog-sk';
import { FilterDialogSkPO } from './filter-dialog-sk_po';

const paramSet: ParamSet = {
  'car make': ['chevrolet', 'dodge', 'ford', 'lincoln motor company'],
  color: ['blue', 'green', 'red'],
  used: ['yes', 'no'],
  year: ['2020', '2019', '2018', '2017', '2016', '2015'],
};

const filters: Filters = {
  diffConfig: {
    'car make': ['chevrolet', 'dodge', 'ford'],
    color: ['blue'],
    year: ['2020', '2019'],
  },
  minRGBADelta: 0,
  maxRGBADelta: 255,
  sortOrder: 'descending',
  mustHaveReferenceImage: false,
};

const differentFilters: Filters = {
  diffConfig: {
    color: ['green'],
    used: ['yes', 'no'],
  },
  minRGBADelta: 50,
  maxRGBADelta: 100,
  sortOrder: 'ascending',
  mustHaveReferenceImage: true,
};

describe('filter-dialog-sk', () => {
  const newInstance = setUpElementUnderTest<FilterDialogSk>('filter-dialog-sk');

  let filterDialogSk: FilterDialogSk;
  let filterDialogSkPO: FilterDialogSkPO;

  beforeEach(() => {
    filterDialogSk = newInstance();
    filterDialogSkPO = new FilterDialogSkPO(filterDialogSk);
  });

  it('should open the dialog with the given filters', async () => {
    expect(await filterDialogSkPO.isDialogOpen()).to.be.false;
    filterDialogSk.open(paramSet, filters);
    expect(await filterDialogSkPO.isDialogOpen()).to.be.true;
    expect(await filterDialogSkPO.getSelectedFilters()).to.deep.equal(filters);
  });

  it('should be possible to reopen the dialog with different filters', async () => {
    filterDialogSk.open(paramSet, filters);
    await filterDialogSkPO.clickCancelBtn();

    filterDialogSk.open(paramSet, differentFilters);
    expect(await filterDialogSkPO.getSelectedFilters()).to.deep.equal(differentFilters);
  });

  describe('filter button', () => {
    it('closes the dialog', async () => {
      filterDialogSk.open(paramSet, filters);
      await filterDialogSkPO.clickFilterBtn();
      expect(await filterDialogSkPO.isDialogOpen()).to.be.false;
    });

    it('returns unmodified filters via the "edit" event if the user made no changes', async () => {
      filterDialogSk.open(paramSet, filters);

      const editEvent = eventPromise<CustomEvent<Filters>>('edit');
      await filterDialogSkPO.clickFilterBtn();
      const newFilters = (await editEvent).detail;

      expect(newFilters).to.deep.equal(filters);
    });

    it('returns the new filters via the "edit" event if the user made some changes', async () => {
      filterDialogSk.open(paramSet, filters);
      await filterDialogSkPO.setSelectedFilters(differentFilters);

      const editEvent = eventPromise<CustomEvent<Filters>>('edit');
      await filterDialogSkPO.clickFilterBtn();
      const newFilters = (await editEvent).detail;

      expect(newFilters).to.deep.equal(differentFilters);
    });
  });

  describe('cancel button', () => {
    it('closes the dialog without emitting the "edit" event', async () => {
      filterDialogSk.open(paramSet, filters);

      const noEvent = noEventPromise('edit');
      await filterDialogSkPO.clickCancelBtn();
      await noEvent;

      expect(await filterDialogSkPO.isDialogOpen()).to.be.false;
    });

    it('discards any changes when reopened with same filters', async () => {
      filterDialogSk.open(paramSet, filters);
      await filterDialogSkPO.setSelectedFilters(differentFilters);
      await filterDialogSkPO.clickCancelBtn();

      filterDialogSk.open(paramSet, filters);
      expect(await filterDialogSkPO.getSelectedFilters()).to.deep.equal(filters);
    });
  });
});
