import './index';

import { $, $$ } from 'common-sk/modules/dom';
import fetchMock from 'fetch-mock';
import {
  firstPage,
  firstPageAfterUndoingFirstEntry,
  firstPageWithoutDetailsAfterUndoingFirstEntry,
  secondPage,
  thirdPage,
} from './test_data';
import {
  eventPromise,
  expectQueryStringToEqual,
  setQueryString,
  setUpElementUnderTest,
} from '../../../infra-sk/modules/test_util';
import { TriagelogPageSk } from './triagelog-page-sk';
import { expect } from 'chai';

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

  // Instantiate page; wait for RPCs to complete and for the page to render.
  const loadTriagelogPageSk = async () => {
    const event = eventPromise('end-task');
    const triagelogPageSk = newInstance();
    await event;
    return triagelogPageSk;
  };

  beforeEach(async () => {
    // Clear query string before each test case. This is needed for test cases
    // that exercise the stateReflector and the browser's back/forward buttons.
    setQueryString('');
  });

  afterEach(() => {
    expect(fetchMock.done()).to.be.true; // All mock RPCs called at least once.
    // Remove fetch mocking to prevent test cases interfering with each other.
    fetchMock.reset();
  });

  it('shows the right initial entries', async () => {
    fetchMock.get(
      '/json/v1/triagelog?details=true&offset=0&size=20', firstPage,
    );
    const triagelogPageSk = await loadTriagelogPageSk(); // Load first page.
    expectQueryStringToEqual(''); // No state reflected to the URL.
    expectFirstPageOfResults(triagelogPageSk);
  });

  it('advances to the second page of results', async () => {
    fetchMock.get(
      '/json/v1/triagelog?details=true&offset=0&size=20', firstPage,
    );
    fetchMock.get(
      '/json/v1/triagelog?details=true&offset=3&size=3', secondPage,
    );

    const triagelogPageSk = await loadTriagelogPageSk(); // Load first page.
    await goToNextPageOfResults(triagelogPageSk); // Load second page.
    expectQueryStringToEqual('?offset=3&page_size=3'); // Reflected in URL.
    expectSecondPageOfResults(triagelogPageSk);
  });

  it('undoes an entry', async () => {
    fetchMock.get(
      '/json/v1/triagelog?details=true&offset=0&size=20', firstPage,
    );
    // We mimic the current behavior of the undo RPC, which is to always return
    // the first page of results.
    // TODO(lovisolo): Rethink this after we delete the old triage log page.
    fetchMock.post(
      '/json/v1/triagelog/undo?id=aaa',
      firstPageWithoutDetailsAfterUndoingFirstEntry,
    );
    fetchMock.get(
      '/json/v1/triagelog?details=true&offset=0&size=3',
      firstPageAfterUndoingFirstEntry,
    );

    const triagelogPageSk = await loadTriagelogPageSk(); // Load first page.
    expectFirstPageOfResults(triagelogPageSk);
    await undoFirstEntry(triagelogPageSk);
    expectFirstPageOfResultsFirstEntryUndone(triagelogPageSk);
  });

  it('handles the "changelist_id" and "crs" URL parameters', async () => {
    fetchMock.get(
      '/json/v1/triagelog?details=true&offset=0&size=20&changelist_id=123456&crs=gerrit',
      firstPage,
    );
    setQueryString('?changelist_id=123456&crs=gerrit');
    const triagelogPageSk = await loadTriagelogPageSk(); // Load first page.
    expectQueryStringToEqual('?changelist_id=123456&crs=gerrit'); // No changes to the URL.
    expectFirstPageOfResults(triagelogPageSk, '123456' /*= changelistID */, 'gerrit' /*= crs */);
  });

  describe('URL parameters', () => {
    it('initializes paging based on the URL parameters', async () => {
      fetchMock.get(
        '/json/v1/triagelog?details=true&offset=3&size=3', secondPage,
      );

      setQueryString('?offset=3&page_size=3');
      const triagelogPageSk = await loadTriagelogPageSk();
      expectSecondPageOfResults(triagelogPageSk);
    });

    it('responds to back and forward browser buttons', async () => {
      fetchMock.get(
        '/json/v1/triagelog?details=true&offset=0&size=20', firstPage,
      );
      fetchMock.get(
        '/json/v1/triagelog?details=true&offset=3&size=3', secondPage,
      );
      fetchMock.get(
        '/json/v1/triagelog?details=true&offset=6&size=3', thirdPage,
      );

      // Populate window.history by setting the query string to a random value.
      // We'll then test that we can navigate back to this state by using the
      // browser's back button.
      setQueryString('?hello=world');

      // Clear the query string before loading the component. This will be the
      // state at component instantiation. We'll test that the user doesn't get
      // stuck at the state at component creation when pressing the back button.
      setQueryString('');

      const triagelogPageSk = await loadTriagelogPageSk(); // Load first page.
      expectQueryStringToEqual('');
      expectFirstPageOfResults(triagelogPageSk);

      await goToNextPageOfResults(triagelogPageSk);
      expectQueryStringToEqual('?offset=3&page_size=3');
      expectSecondPageOfResults(triagelogPageSk);

      await goToNextPageOfResults(triagelogPageSk);
      expectQueryStringToEqual('?offset=6&page_size=3');
      expectThirdPageOfResults(triagelogPageSk);

      await goBack();
      expectQueryStringToEqual('?offset=3&page_size=3');
      expectSecondPageOfResults(triagelogPageSk);

      // State at component instantiation.
      await goBack();
      expectQueryStringToEqual('');
      expectFirstPageOfResults(triagelogPageSk);

      // State before the component was instantiated.
      await goBack();
      expectQueryStringToEqual('?hello=world');

      await goForward();
      expectQueryStringToEqual('');
      expectFirstPageOfResults(triagelogPageSk);

      await goForward();
      expectQueryStringToEqual('?offset=3&page_size=3');
      expectSecondPageOfResults(triagelogPageSk);

      await goForward();
      expectQueryStringToEqual('?offset=6&page_size=3');
      expectThirdPageOfResults(triagelogPageSk);
    });
  });

  describe('RPC error', () => {
    it('should emit event "fetch-error" on RPC failure', async () => {
      fetchMock.get('glob:*', 500); // Internal server error on any request.

      const event = eventPromise('fetch-error');
      const triagelogPageSk = newInstance(); // Instantiate page; fail due to RPC errors.
      await event;

      expectEmptyPage(triagelogPageSk);
    });
  });
});

function goToNextPageOfResults(triagelogPageSk: TriagelogPageSk) {
  const event = eventPromise('end-task');
  $$<HTMLButtonElement>('pagination-sk button.next', triagelogPageSk)!.click();
  return event;
}

function undoFirstEntry(triagelogPageSk: TriagelogPageSk) {
  const event = eventPromise('end-task');
  $$<HTMLButtonElement>('tbody button.undo', triagelogPageSk)!.click();
  return event;
}

function goBack() {
  const event = eventPromise('end-task');
  history.back();
  return event;
}

function goForward() {
  const event = eventPromise('end-task');
  history.forward();
  return event;
}

function expectEmptyPage(triagelogPageSk: TriagelogPageSk) {
  expect($$('tbody', triagelogPageSk)!.children).to.be.empty;
}

function expectFirstPageOfResults(triagelogPageSk: TriagelogPageSk, changelistID = '', crs = '') {
  expect(nthEntryTimestamp(triagelogPageSk, 0)).to.equal(toLocalDateStr(1572000000000));
  expect(nthEntryAuthor(triagelogPageSk, 0)).to.equal('alpha@google.com');
  expect(nthEntryNumChanges(triagelogPageSk, 0)).to.equal(2);

  expect(nthDetailsRowTestName(triagelogPageSk, 0)).to.equal('async_rescale_and_read_dog_up');
  expect(nthDetailsRowDigest(triagelogPageSk, 0)).to.equal('f16298eb14e19f9230fe81615200561f');
  expect(nthDetailsRowLabel(triagelogPageSk, 0)).to.equal('positive');
  let digestHref = nthDetailsRowDigestHref(triagelogPageSk, 0);
  expect(digestHref).to.contain(
    '/detail?test=async_rescale_and_read_dog_up&digest=f16298eb14e19f9230fe81615200561f',
  );
  if (changelistID) {
    expect(digestHref).to.contain(`&changelist_id=${changelistID}&crs=${crs}`);
  } else {
    expect(digestHref).not.to.contain('&changelist_id');
  }

  expect(nthEntryTimestamp(triagelogPageSk, 1)).to.equal(toLocalDateStr(1571900000000));
  expect(nthEntryAuthor(triagelogPageSk, 1)).to.equal('beta@google.com');
  expect(nthEntryNumChanges(triagelogPageSk, 1)).to.equal(1);

  expect(nthDetailsRowTestName(triagelogPageSk, 1)).to.equal('async_rescale_and_read_rose');
  expect(nthDetailsRowDigest(triagelogPageSk, 1)).to.equal('35c77280a7d5378033f9bf8f3c755e78');
  expect(nthDetailsRowLabel(triagelogPageSk, 1)).to.equal('positive');
  digestHref = nthDetailsRowDigestHref(triagelogPageSk, 1);
  expect(digestHref).to.contain(
    '/detail?test=async_rescale_and_read_rose&digest=35c77280a7d5378033f9bf8f3c755e78',
  );
  if (changelistID) {
    expect(digestHref).to.contain(`&changelist_id=${changelistID}&crs=${crs}`);
  } else {
    expect(digestHref).not.to.contain('&changelist_id');
  }

  expect(nthEntryTimestamp(triagelogPageSk, 2)).to.equal(toLocalDateStr(1571800000000));
  expect(nthEntryAuthor(triagelogPageSk, 2)).to.equal('gamma@google.com');
  expect(nthEntryNumChanges(triagelogPageSk, 2)).to.equal(1);

  expect(nthDetailsRowTestName(triagelogPageSk, 2)).to.equal('draw_image_set');
  expect(nthDetailsRowDigest(triagelogPageSk, 2)).to.equal('b788aadee662c2b0390d698cbe68b808');
  expect(nthDetailsRowLabel(triagelogPageSk, 2)).to.equal('positive');
  digestHref = nthDetailsRowDigestHref(triagelogPageSk, 2);
  expect(digestHref).to.contain(
    '/detail?test=draw_image_set&digest=b788aadee662c2b0390d698cbe68b808',
  );
  if (changelistID) {
    expect(digestHref).to.contain(`&changelist_id=${changelistID}&crs=${crs}`);
  } else {
    expect(digestHref).not.to.contain('&changelist_id');
  }

  expect(nthDetailsRowTestName(triagelogPageSk, 3)).to.equal('filterbitmap_text_7.00pt');
  expect(nthDetailsRowDigest(triagelogPageSk, 3)).to.equal('454b4b547bc6ceb4cdeb3305553be98a');
  expect(nthDetailsRowLabel(triagelogPageSk, 3)).to.equal('positive');
  digestHref = nthDetailsRowDigestHref(triagelogPageSk, 3);
  expect(digestHref).to.contain(
    '/detail?test=filterbitmap_text_7.00pt&digest=454b4b547bc6ceb4cdeb3305553be98a',
  );
  if (changelistID) {
    expect(digestHref).to.contain(`&changelist_id=${changelistID}&crs=${crs}`);
  } else {
    expect(digestHref).not.to.contain('&changelist_id');
  }
}

// TODO(kjlubick, lovisolo): rewrite these expects* to be more like above.
function expectFirstPageOfResultsFirstEntryUndone(triagelogPageSk: TriagelogPageSk) {
  expect(nthEntry(triagelogPageSk, 0)).to.deep.equal(
    [toLocalDateStr(1571900000000), 'beta@google.com', 1],
  );
  expect(nthDetailsRow(triagelogPageSk, 0)).to.deep.equal([
    'draw_image_set',
    'b788aadee662c2b0390d698cbe68b808',
    digestDetailsHref(
      'draw_image_set',
      'b788aadee662c2b0390d698cbe68b808',
    ),
    'positive']);
  expect(nthEntry(triagelogPageSk, 1)).to.deep.equal(
    [toLocalDateStr(1571800000000), 'gamma@google.com', 1],
  );
  expect(nthDetailsRow(triagelogPageSk, 1)).to.deep.equal([
    'filterbitmap_text_7.00pt',
    '454b4b547bc6ceb4cdeb3305553be98a',
    digestDetailsHref(
      'filterbitmap_text_7.00pt',
      '454b4b547bc6ceb4cdeb3305553be98a',
    ),
    'positive']);
  expect(nthEntry(triagelogPageSk, 2)).to.deep.equal(
    [toLocalDateStr(1571700000000), 'delta@google.com', 1],
  );
  expect(nthDetailsRow(triagelogPageSk, 2)).to.deep.equal([
    'filterbitmap_text_10.00pt',
    'fc8392000945e68334c5ccd333b201b3',
    digestDetailsHref(
      'filterbitmap_text_10.00pt',
      'fc8392000945e68334c5ccd333b201b3',
    ),
    'positive']);
}

function expectSecondPageOfResults(triagelogPageSk: TriagelogPageSk) {
  expect(nthEntry(triagelogPageSk, 0)).to.deep.equal(
    [toLocalDateStr(1571700000000), 'delta@google.com', 1],
  );
  expect(nthDetailsRow(triagelogPageSk, 0)).to.deep.equal([
    'filterbitmap_text_10.00pt',
    'fc8392000945e68334c5ccd333b201b3',
    digestDetailsHref(
      'filterbitmap_text_10.00pt',
      'fc8392000945e68334c5ccd333b201b3',
    ),
    'positive']);
  expect(nthEntry(triagelogPageSk, 1)).to.deep.equal([
    toLocalDateStr(1571600000000),
    'epsilon@google.com',
    1]);
  expect(nthDetailsRow(triagelogPageSk, 1)).to.deep.equal([
    'filterbitmap_image_mandrill_32.png',
    '7606bfd486f7dfdf299d9d9da8f99c8e',
    digestDetailsHref(
      'filterbitmap_image_mandrill_32.png',
      '7606bfd486f7dfdf299d9d9da8f99c8e',
    ),
    'positive']);
  expect(nthEntry(triagelogPageSk, 2)).to.deep.equal(
    [toLocalDateStr(1571500000000), 'zeta@google.com', 1],
  );
  expect(nthDetailsRow(triagelogPageSk, 2)).to.deep.equal([
    'drawminibitmaprect_aa',
    '95e1b42fcaaff5d0d08b4ed465d79437',
    digestDetailsHref(
      'drawminibitmaprect_aa',
      '95e1b42fcaaff5d0d08b4ed465d79437',
    ),
    'positive']);
}

function expectThirdPageOfResults(triagelogPageSk: TriagelogPageSk) {
  expect(nthEntry(triagelogPageSk, 0)).to.deep.equal(
    [toLocalDateStr(1571400000000), 'eta@google.com', 1],
  );
  expect(nthDetailsRow(triagelogPageSk, 0)).to.deep.equal([
    'colorcomposefilter_wacky',
    '68e41c7f7d91f432fd36d71fe1249443',
    digestDetailsHref(
      'colorcomposefilter_wacky',
      '68e41c7f7d91f432fd36d71fe1249443',
    ),
    'positive']);
  expect(nthEntry(triagelogPageSk, 1)).to.deep.equal(
    [toLocalDateStr(1571300000000), 'theta@google.com', 1],
  );
  expect(nthDetailsRow(triagelogPageSk, 1)).to.deep.equal([
    'circular_arc_stroke_matrix',
    'c482098318879e7d2cf4f0414b607156',
    digestDetailsHref(
      'circular_arc_stroke_matrix',
      'c482098318879e7d2cf4f0414b607156',
    ),
    'positive']);
  expect(nthEntry(triagelogPageSk, 2)).to.deep.equal(
    [toLocalDateStr(1571200000000), 'iota@google.com', 1],
  );
  expect(nthDetailsRow(triagelogPageSk, 2)).to.deep.equal([
    'dftext_blob_persp',
    'a41baae99abd37d9ed606e8bc27df6a2',
    digestDetailsHref(
      'dftext_blob_persp',
      'a41baae99abd37d9ed606e8bc27df6a2',
    ),
    'positive']);
}

const toLocalDateStr = (timestampMS: number) => new Date(timestampMS).toLocaleString();
const digestDetailsHref = (test: string, digest: string) =>
    `${window.location.origin}/detail?test=${encodeURIComponent(test)}` +
    `&digest=${encodeURIComponent(digest)}`;

const nthEntryTimestamp = (triagelogPageSk: TriagelogPageSk, n: number) =>
    $<HTMLElement>('.timestamp', triagelogPageSk)[n].innerText;
const nthEntryAuthor = (triagelogPageSk: TriagelogPageSk, n: number) =>
    $<HTMLElement>('.author', triagelogPageSk)[n].innerText;
const nthEntryNumChanges = (triagelogPageSk: TriagelogPageSk, n: number) =>
    +$<HTMLElement>('.num-changes', triagelogPageSk)[n].innerText;
const nthEntry = (triagelogPageSk: TriagelogPageSk, n: number) => [
  nthEntryTimestamp(triagelogPageSk, n),
  nthEntryAuthor(triagelogPageSk, n),
  nthEntryNumChanges(triagelogPageSk, n),
];

const nthDetailsRowTestName = (triagelogPageSk: TriagelogPageSk, n: number) =>
    $<HTMLElement>('.details .test-name', triagelogPageSk)[n].innerText;
const nthDetailsRowDigest = (triagelogPageSk: TriagelogPageSk, n: number) =>
    $<HTMLElement>('.details .digest', triagelogPageSk)[n].innerText;
const nthDetailsRowDigestHref = (triagelogPageSk: TriagelogPageSk, n: number) =>
    $<HTMLAnchorElement>('.details .digest a', triagelogPageSk)[n].href;
const nthDetailsRowLabel = (triagelogPageSk: TriagelogPageSk, n: number) =>
    $<HTMLElement>('.details .label', triagelogPageSk)[n].innerText;
const nthDetailsRow = (triagelogPageSk: TriagelogPageSk, n: number) => [
  nthDetailsRowTestName(triagelogPageSk, n),
  nthDetailsRowDigest(triagelogPageSk, n),
  nthDetailsRowDigestHref(triagelogPageSk, n),
  nthDetailsRowLabel(triagelogPageSk, n),
];

// TODO(lovisolo): Add a function eventSequencePromise() to test_util.js that
//                 takes a list of event names and returns a promise that
//                 resolves when the events are caught in the given sequence,
//                 or reject if any of the events are caught out-of-sequence.
//                 Leverage eventPromise() to implement this.
//
// TODO(lovisolo): Use eventSequencePromise(['begin-task', 'end-task']) above
//                 where appropriate. Idem with 'fetch-error'.
