import './index';

import { expect } from 'chai';
import { $, $$ } from 'common-sk/modules/dom';
import fetchMock from 'fetch-mock';
import { SelectSk } from 'elements-sk/select-sk/select-sk';
import { pageSets } from './test_data';
import { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';
import { PagesetSelectorSk } from './pageset-selector-sk';

describe('pageset-selector-sk', () => {
  const factory = setUpElementUnderTest<PagesetSelectorSk>('pageset-selector-sk');
  // Returns a new element with the pagesets fetch complete.
  const newInstance = async (init?: ((instance: PagesetSelectorSk)=> void)) => {
    const ele = factory(init);
    await new Promise((resolve) => setTimeout(resolve, 0));
    return ele;
  };

  let selector: PagesetSelectorSk; // Set at start of each test.
  beforeEach(() => {
    fetchMock.postOnce('begin:/_/page_sets/', pageSets);
  });

  afterEach(() => {
    //  Check all mock fetches called at least once and reset.
    expect(fetchMock.done()).to.be.true;
    fetchMock.reset();
  });

  const simulateUserToggle = () => {
    ($$('expandable-textarea-sk > button', selector) as HTMLElement).click();
  };

  // Simulates a user typing 'value' into the input element by setting its
  // value and triggering the built-in 'input' event.
  const simulateUserEnteringCustomPages = (value: string) => {
    const ele = $$('textarea', selector) as HTMLInputElement;
    ele.focus();
    ele.value = value;
    ele.dispatchEvent(new Event('input', {
      bubbles: true,
      cancelable: true,
    }));
  };

  it('loads selections', async () => {
    selector = await newInstance(undefined);
    expect($('select-sk div')).to.have.length(8);
    expect($$('.pageset-list', selector)).to.have.property('hidden', false);
    expect(selector).to.have.property('selected', '10k');
  });

  it('reflects changes to selected', async () => {
    selector = await newInstance(undefined);
    expect(selector).to.have.property('selected', '10k');
    ($$('select-sk', selector) as SelectSk).selection = 3;
    expect(selector).to.have.property('selected', 'Mobile10k');
    selector.selected = 'Dummy1k';
    expect(selector).to.have.property('selected', 'Dummy1k');
    // Invalid keys aren't honored.
    selector.selected = 'bogus key';
    expect(selector).to.have.property('selected', '');
  });

  it('filters out hideKeys options', async () => {
    selector = await newInstance((ele) => {
      ele.hideKeys = ['Mobile100k', '100k', 'Dummy1k', 'non-existant'];
    });
    expect($('select-sk div', selector)).to.have.length(5);
    // Check that options can be recovered.
    selector.hideKeys = [];
    expect($('select-sk div', selector)).to.have.length(8);
  });

  it('hides selector when custom page form expanded', async () => {
    selector = await newInstance(undefined);
    simulateUserToggle();
    expect($$('.pageset-list', selector)).to.have.property('hidden', true);
  });

  it('clears custom pages when custom page form collapsed ', async () => {
    selector = await newInstance(undefined);
    simulateUserToggle();
    simulateUserEnteringCustomPages('example.com');
    expect(selector).to.have.property('customPages', 'example.com');
    expect($$('.pageset-list', selector)).to.have.property('hidden', true);
    simulateUserToggle();
    expect($$('.pageset-list', selector)).to.have.property('hidden', false);
    expect(selector).to.have.property('customPages', '');
  });

  it('disables custom page form on disable-custom-webpages', async () => {
    selector = await newInstance((ele) => {
      ele.setAttribute('disable-custom-webpages', '');
    });
    expect(selector.querySelectorAll('expandable-textarea-sk').length).to.equal(0);
    expect(selector.querySelectorAll('select-sk').length).to.equal(1);
  });
});
