import './index';

import { $, $$ } from 'common-sk/modules/dom';
import fetchMock from 'fetch-mock';
import {
  canvaskit, gm, svg, trstatus,
} from './demo_data';
import {
  setUpElementUnderTest,
  eventPromise,
  setQueryString,
  expectQueryStringToEqual,
} from '../../../infra-sk/modules/test_util';
import { testOnlySetSettings } from '../settings';

describe('byblame-page-sk', () => {
  const newInstance = setUpElementUnderTest('byblame-page-sk');

  const loadedByblamePageSk = (opts = {}) => {
    testOnlySetSettings({
      defaultCorpus: opts.defaultCorpus || 'gm',
      baseRepoURL: opts.baseRepoUrl || 'https://skia.googlesource.com/skia.git',
    });
    return new Promise((resolve) => {
      let endTaskCalls = 0;
      const byBlamePageSk = newInstance((ele) => {
        ele.addEventListener('end-task', () => {
          endTaskCalls++;
          if (endTaskCalls === 2) { // Wait for 2 RPCs to finish.
            resolve(byBlamePageSk);
          }
        });
      });
    });
  };

  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 loading indicator', async () => {
    fetchMock.get('/json/v1/trstatus', trstatus);

    // We'll resolve this RPC later to give the "loading" text a chance to show.
    let resolveByBlameRpc;
    fetchMock.get(
      '/json/v1/byblame?query=source_type%3Dgm',
      new Promise((resolve) => resolveByBlameRpc = resolve),
    );

    // Instantiate page, but don't wait for it to load as we want to see the
    // "loading" text.
    const event = eventPromise('end-task');
    testOnlySetSettings({ defaultCorpus: 'gm' });
    const byblamePageSk = newInstance();

    // Make these assertions immediately, i.e. do not wait for the page to load.
    expect($$('.entries', byblamePageSk).innerText).to.equal('Loading untriaged digests...');
    expectHasEmptyBlames(byblamePageSk);

    // Resolve RPC. This allows the page to finish loading.
    resolveByBlameRpc(gm);

    // Assert that page finished loading.
    await event;
  });

  it('correctly renders a page with empty results', async () => {
    fetchMock.get('/json/v1/trstatus', trstatus);
    fetchMock.get('/json/v1/byblame?query=source_type%3Dcanvaskit', canvaskit);

    const byblamePageSk = await loadedByblamePageSk({ defaultCorpus: 'canvaskit' });

    expectQueryStringToEqual('');
    expectCorporaToBe(byblamePageSk, ['canvaskit', 'gm (114)', 'svg (18)']);
    expectSelectedCorpusToBe(byblamePageSk, 'canvaskit');
    expect($$('.entries', byblamePageSk).innerText)
      .to.equal('No untriaged digests for corpus canvaskit.');
    expectHasEmptyBlames(byblamePageSk);
  });

  it('renders blames for default corpus if URL does not include a corpus',
    async () => {
      fetchMock.get('/json/v1/trstatus', trstatus);
      fetchMock.get('/json/v1/byblame?query=source_type%3Dgm', gm);

      const byblamePageSk = await loadedByblamePageSk({ defaultCorpus: 'gm' });

      expectQueryStringToEqual(''); // No state reflected to the URL.
      expectSelectedCorpusToBe(byblamePageSk, 'gm (114)');
      expectHasGmBlames(byblamePageSk);
    });

  it('renders blames for corpus specified in URL', async () => {
    fetchMock.get('/json/v1/trstatus', trstatus);
    fetchMock.get('/json/v1/byblame?query=source_type%3Dsvg', svg);
    setQueryString('?corpus=svg');

    const byblamePageSk = await loadedByblamePageSk({ defaultCorpus: 'gm' });

    expectSelectedCorpusToBe(byblamePageSk, 'svg (18)');
    expectHasSvgBlames(byblamePageSk);
  });

  it('switches corpora when corpus-selector-sk is clicked', async () => {
    fetchMock.get('/json/v1/trstatus', trstatus);
    fetchMock.get('/json/v1/byblame?query=source_type%3Dgm', gm);
    fetchMock.get('/json/v1/byblame?query=source_type%3Dsvg', svg);

    const byblamePageSk = await loadedByblamePageSk({ defaultCorpus: 'gm' });

    expectQueryStringToEqual('');
    expectSelectedCorpusToBe(byblamePageSk, 'gm (114)');
    expectHasGmBlames(byblamePageSk);

    await selectCorpus(byblamePageSk, 'svg (18)');

    expectQueryStringToEqual('?corpus=svg');
    expectSelectedCorpusToBe(byblamePageSk, 'svg (18)');
    expectHasSvgBlames(byblamePageSk);
  });

  describe('Base repository URL', () => {
    beforeEach(() => {
      fetchMock.get('/json/v1/trstatus', trstatus);
      fetchMock.get('/json/v1/byblame?query=source_type%3Dgm', gm);
    });

    it('renders commit links correctly with repo hosted on googlesource',
      async () => {
        const byblamePageSk = await loadedByblamePageSk({
          defaultCorpus: 'gm',
          baseRepoUrl: 'https://skia.googlesource.com/skia.git',
        });

        expectSelectedCorpusToBe(byblamePageSk, 'gm (114)');
        expectHasGmBlames(byblamePageSk);
        expectFirstCommitLinkHrefToBe(
          byblamePageSk,
          'https://skia.googlesource.com/skia.git/+show/05f6a01bf9fd25be9e5fff4af5505c3945058b1d',
        );
      });

    it('renders commit links correctly with repo hosted on GitHub',
      async () => {
        const byblamePageSk = await loadedByblamePageSk({
          defaultCorpus: 'gm',
          baseRepoUrl: 'https://github.com/google/skia',
        });

        expectSelectedCorpusToBe(byblamePageSk, 'gm (114)');
        expectHasGmBlames(byblamePageSk);
        expectFirstCommitLinkHrefToBe(
          byblamePageSk,
          'https://github.com/google/skia/commit/05f6a01bf9fd25be9e5fff4af5505c3945058b1d',
        );
      });
  });
});

function selectCorpus(byblamePageSk, corpus) {
  const event = eventPromise('end-task');
  $$(`corpus-selector-sk li[title="${corpus}"]`, byblamePageSk).click();
  return event;
}

function expectCorporaToBe(byblamePageSk, corpora) {
  expect($('corpus-selector-sk li').map((li) => li.innerText))
    .to.deep.equal(corpora);
}

function expectSelectedCorpusToBe(byblamePageSk, corpus) {
  expect($$('corpus-selector-sk li.selected', byblamePageSk).innerText)
    .to.equal(corpus);
}

function expectHasEmptyBlames(byblamePageSk) {
  expectBlames(byblamePageSk, 0);
}

function expectHasGmBlames(byblamePageSk) {
  // Triage links for first and last entries obtained from the demo page.
  expectBlames(
    byblamePageSk,
    6,
    '/search?blame=4edb719f1bc49bae585ff270df17f08039a96b6c:252cdb782418949651cc5eb7d467c57ddff3d1c7:a1050ed2b1120613d9ae9587e3c0f4116e17337f:3f7c865936cc808af26d88bc1f5740a29cfce200:05f6a01bf9fd25be9e5fff4af5505c3945058b1d&corpus=gm&query=source_type%3Dgm',
    '/search?blame=342fbc54844d0d3fc9d20e20b45115db1e33395b&corpus=gm&query=source_type%3Dgm',
  );
}

function expectHasSvgBlames(byblamePageSk) {
  // Triage links for first and last entries obtained from the demo page.
  expectBlames(
    byblamePageSk,
    5,
    '/search?blame=d2c67f44f8c2351e60e6ee224a060e916cd44f34&corpus=svg&query=source_type%3Dsvg',
    '/search?blame=e1e197186238d8d304a39db9f94258d9584a8973&corpus=svg&query=source_type%3Dsvg',
  );
}

function expectBlames(
  byblamePageSk,
  numBlames,
  firstTriageLinkHref,
  lastTriageLinkHref,
) {
  const entries = $('byblameentry-sk', byblamePageSk);
  expect(entries).to.have.length(numBlames);

  // Spot check first and last entries.
  if (firstTriageLinkHref) {
    expect($$('a.triage', entries[0]).href)
      .to.have.string(firstTriageLinkHref);
  }
  if (lastTriageLinkHref) {
    expect($$('a.triage', entries[entries.length - 1]).href)
      .to.have.string(lastTriageLinkHref);
  }
}

function expectFirstCommitLinkHrefToBe(byblamePageSk, expectedHref) {
  const firstCommitLinkSelector = 'byblameentry-sk:first-child ul.blames a:first-child';
  const actualHref = $$(firstCommitLinkSelector, byblamePageSk).href;
  expect(actualHref).to.equal(expectedHref);
}
