/**
 * @license
 * Copyright 2023 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import {html, assert, fixture, waitUntil} from '@open-wc/testing';
import './gr-router';
import {Page, PageContext} from './gr-page';

suite('gr-page tests', () => {
  let page: Page;

  setup(() => {
    page = new Page();
    page.start({dispatch: false, base: ''});
  });

  teardown(() => {
    page.stop();
  });

  suite('click handler', () => {
    const clickListener = (e: Event) => e.preventDefault();
    let spy: sinon.SinonSpy;
    let link: HTMLAnchorElement;

    setup(async () => {
      spy = sinon.spy();
      link = await fixture<HTMLAnchorElement>(html`<a href="/settings"></a>`);

      document.addEventListener('click', clickListener);
    });

    teardown(() => {
      document.removeEventListener('click', clickListener);
    });

    test('click handled by specific route', async () => {
      page.registerRoute(/\/settings/, spy);
      link.href = '/settings';
      link.click();
      assert.isTrue(spy.calledOnce);
    });

    test('click handled by default route', async () => {
      page.registerRoute(/.*/, spy);
      link.href = '/something';
      link.click();
      assert.isTrue(spy.called);
    });

    test('click not handled for /plugins/... links', async () => {
      page.registerRoute(/.*/, spy);
      link.href = '/plugins/gitiles';
      link.click();
      assert.isFalse(spy.called);
    });

    test('click not handled for /login/... links', async () => {
      page.registerRoute(/.*/, spy);
      link.href = '/login';
      link.click();
      assert.isFalse(spy.called);
    });
  });

  test('register route and exit', () => {
    const handleA = sinon.spy();
    const handleAExit = sinon.stub();
    page.registerRoute(/\/A/, handleA);
    page.registerExitRoute(/\/A/, handleAExit);

    page.show('/A');
    assert.equal(handleA.callCount, 1);
    assert.equal(handleAExit.callCount, 0);

    page.show('/B');
    assert.equal(handleA.callCount, 1);
    assert.equal(handleAExit.callCount, 1);
  });

  test('register, show, replace', () => {
    const handleA = sinon.spy();
    const handleB = sinon.spy();
    page.registerRoute(/\/A/, handleA);
    page.registerRoute(/\/B/, handleB);

    page.show('/A');
    assert.equal(handleA.callCount, 1);
    assert.equal(handleB.callCount, 0);

    page.show('/B');
    assert.equal(handleA.callCount, 1);
    assert.equal(handleB.callCount, 1);

    page.replace('/A');
    assert.equal(handleA.callCount, 2);
    assert.equal(handleB.callCount, 1);

    page.replace('/B');
    assert.equal(handleA.callCount, 2);
    assert.equal(handleB.callCount, 2);
  });

  test('popstate browser back', async () => {
    const handleA = sinon.spy();
    const handleB = sinon.spy();
    page.registerRoute(/\/A/, handleA);
    page.registerRoute(/\/B/, handleB);

    page.show('/A');
    assert.equal(handleA.callCount, 1);
    assert.equal(handleB.callCount, 0);

    page.show('/B');
    assert.equal(handleA.callCount, 1);
    assert.equal(handleB.callCount, 1);

    window.history.back();
    await waitUntil(() => window.location.href.includes('/A'));
    assert.equal(handleA.callCount, 2);
    assert.equal(handleB.callCount, 1);
  });

  test('register pattern, check context', async () => {
    let context: PageContext;
    const handler = (ctx: PageContext) => (context = ctx);
    page.registerRoute(/\/asdf\/(.*)\/qwer\/(.*)\//, handler);
    page.stop();
    page.start({dispatch: false, base: '/base'});

    page.show('/base/asdf/1234/qwer/abcd/');

    await waitUntil(() => !!context);
    assert.equal(context!.canonicalPath, '/base/asdf/1234/qwer/abcd/');
    assert.equal(context!.path, '/asdf/1234/qwer/abcd/');
    assert.equal(context!.querystring, '');
    assert.equal(context!.hash, '');
    assert.equal(context!.params[0], '1234');
    assert.equal(context!.params[1], 'abcd');

    page.show('/asdf//qwer////?a=b#go');

    await waitUntil(() => !!context);
    assert.equal(context!.canonicalPath, '/base/asdf//qwer////?a=b#go');
    assert.equal(context!.path, '/asdf//qwer////?a=b');
    assert.equal(context!.querystring, 'a=b');
    assert.equal(context!.hash, 'go');
    assert.equal(context!.params[0], '');
    assert.equal(context!.params[1], '//');
  });
});
