import './index';
import { expect } from 'chai';
import { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';
import { EditIgnoreRuleSk } from './edit-ignore-rule-sk';
import { EditIgnoreRuleSkPO } from './edit-ignore-rule-sk_po';

describe('edit-ignore-rule-sk', () => {
  const newInstance = setUpElementUnderTest<EditIgnoreRuleSk>('edit-ignore-rule-sk');

  // This date is arbitrary
  const fakeNow = Date.parse('2020-02-01T00:00:00Z');
  const regularNow = Date.now;

  let editIgnoreRuleSk: EditIgnoreRuleSk;
  let editIgnoreRuleSkPO: EditIgnoreRuleSkPO;

  beforeEach(() => {
    editIgnoreRuleSk = newInstance();
    // All tests will have the paramset loaded.
    editIgnoreRuleSk.paramset = {
      alpha_type: ['Opaque', 'Premul'],
      arch: ['arm', 'arm64', 'x86', 'x86_64'],
    };
    Date.now = () => fakeNow;
    editIgnoreRuleSkPO = new EditIgnoreRuleSkPO(editIgnoreRuleSk);
  });

  afterEach(() => {
    Date.now = regularNow;
  });

  describe('inputs and outputs', () => {
    it('has no query, note or expires', () => {
      expect(editIgnoreRuleSk.query).to.equal('');
      expect(editIgnoreRuleSk.note).to.equal('');
      expect(editIgnoreRuleSk.expires).to.equal('');
    });

    it('reflects typed in values', async () => {
      await editIgnoreRuleSkPO.setExpires('2w');
      await editIgnoreRuleSkPO.setNote('this is a bug');
      expect(editIgnoreRuleSk.expires).to.equal('2w');
      expect(editIgnoreRuleSk.note).to.equal('this is a bug');
    });

    it('reflects interactions with the query-sk element', async () => {
      const querySkPO = await editIgnoreRuleSkPO.querySkPO;
      await querySkPO.clickKey('alpha_type');
      await querySkPO.clickValue('Opaque');
      expect(editIgnoreRuleSk.query).to.equal('alpha_type=Opaque');
    });

    it('converts future dates to human readable durations', () => {
      editIgnoreRuleSk.expires = '2020-02-07T06:00:00Z';
      // It is ok that the 6 hours gets rounded out.
      expect(editIgnoreRuleSk.expires).to.equal('6d');
    });

    it('converts past or invalid dates to nothing (requiring them to be re-input)', () => {
      editIgnoreRuleSk.expires = '2020-01-07T06:00:00Z';
      expect(editIgnoreRuleSk.expires).to.equal('');
      editIgnoreRuleSk.expires = 'invalid date';
      expect(editIgnoreRuleSk.expires).to.equal('');
    });

    it('can add a custom key and value', async () => {
      editIgnoreRuleSk.query = 'arch=arm64';

      // Add a new value to an existing param
      await editIgnoreRuleSkPO.setCustomKey('arch');
      await editIgnoreRuleSkPO.setCustomValue('y75');
      await editIgnoreRuleSkPO.clickAddCustomParamBtn();

      // add a brand new key and value
      await editIgnoreRuleSkPO.setCustomKey('custom');
      await editIgnoreRuleSkPO.setCustomValue('value');
      await editIgnoreRuleSkPO.clickAddCustomParamBtn();

      expect(editIgnoreRuleSk.query).to.equal('arch=arm64&arch=y75&custom=value');
      // ParamSet should be mutated to have the new values
      expect(editIgnoreRuleSk.paramset.arch)
        .to.deep.equal(['arm', 'arm64', 'x86', 'x86_64', 'y75']);
      expect(editIgnoreRuleSk.paramset.custom).to.deep.equal(['value']);
    });
  });

  describe('validation', () => {
    it('has the error msg hidden by default', async () => {
      expect(await editIgnoreRuleSkPO.isErrorMessageVisible()).to.be.false;
    });

    it('does not validate when query is empty', async () => {
      editIgnoreRuleSk.query = '';
      editIgnoreRuleSk.expires = '2w';
      expect(editIgnoreRuleSk.verifyFields()).to.be.false;
      expect(await editIgnoreRuleSkPO.isErrorMessageVisible()).to.be.true;
    });

    it('does not validate when expires is empty', async () => {
      editIgnoreRuleSk.query = 'alpha_type=Opaque';
      editIgnoreRuleSk.expires = '';
      expect(editIgnoreRuleSk.verifyFields()).to.be.false;
      expect(await editIgnoreRuleSkPO.isErrorMessageVisible()).to.be.true;
    });

    it('does not validate when both expires and query are empty', async () => {
      editIgnoreRuleSk.query = '';
      editIgnoreRuleSk.expires = '';
      expect(editIgnoreRuleSk.verifyFields()).to.be.false;
      expect(await editIgnoreRuleSkPO.isErrorMessageVisible()).to.be.true;
    });

    it('does passes validation when both expires and query are set', async () => {
      editIgnoreRuleSk.query = 'foo=bar';
      await editIgnoreRuleSkPO.setExpires('1w');
      expect(editIgnoreRuleSk.verifyFields()).to.be.true;
      expect(await editIgnoreRuleSkPO.isErrorMessageVisible()).to.be.false;
    });

    it('requires both a custom key and value', async () => {
      expect(editIgnoreRuleSk.query).to.equal('');

      await editIgnoreRuleSkPO.setCustomKey('');
      await editIgnoreRuleSkPO.setCustomValue('');
      await editIgnoreRuleSkPO.clickAddCustomParamBtn();

      expect(await editIgnoreRuleSkPO.getErrorMessage()).to.contain('both a key and a value');
      expect(editIgnoreRuleSk.query).to.equal('');

      await editIgnoreRuleSkPO.setCustomKey('custom');
      await editIgnoreRuleSkPO.setCustomValue('');
      await editIgnoreRuleSkPO.clickAddCustomParamBtn();

      expect(await editIgnoreRuleSkPO.getErrorMessage()).to.contain('both a key and a value');
      expect(editIgnoreRuleSk.query).to.equal('');

      await editIgnoreRuleSkPO.setCustomKey('');
      await editIgnoreRuleSkPO.setCustomValue('value');
      await editIgnoreRuleSkPO.clickAddCustomParamBtn();

      expect(await editIgnoreRuleSkPO.getErrorMessage()).to.contain('both a key and a value');
      expect(editIgnoreRuleSk.query).to.equal('');
    });
  });
});
