/**
 * @license
 * Copyright 2023 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../test/common-test-setup';
import './gr-app-element';
import {testResolver} from '../test/common-test-setup';
import {fixture, html, assert} from '@open-wc/testing';
import {GrRouter, routerToken} from './core/gr-router/gr-router';
import {
  queryAndAssert,
  queryAll,
  stubRestApi,
  waitQueryAndAssert,
} from '../test/test-utils';
import {GrAppElement} from './gr-app-element';
import {LitElement} from 'lit';
import {createSearchUrl} from '../models/views/search';
import {createChange} from '../test/test-data-generators';
import {NumericChangeId} from '../api/rest-api';
import {createSettingsUrl} from '../models/views/settings';

suite('integration tests', () => {
  let appElement: GrAppElement;
  let router: GrRouter;

  const assertView = async function <T extends LitElement>(tagName: string) {
    await appElement.updateComplete;
    const view = await waitQueryAndAssert<T>(appElement, tagName);
    assert.isOk(view);
    return view;
  };

  const assertItems = function (el: HTMLElement) {
    const list = queryAndAssert(el, 'gr-change-list');
    const section = queryAndAssert(list, 'gr-change-list-section');
    return queryAll(section, 'gr-change-list-item');
  };

  setup(async () => {
    appElement = await fixture<GrAppElement>(
      html`<gr-app-element id="app-element"></gr-app-element>`
    );
    router = testResolver(routerToken);
    router._testOnly_startRouter();
    await appElement.updateComplete;
  });

  teardown(async () => {
    router.finalize();
  });

  test('navigate from search view page to settings page and back', async () => {
    stubRestApi('getChanges').returns(
      Promise.resolve([
        createChange({_number: 1 as NumericChangeId}),
        createChange({_number: 2 as NumericChangeId}),
        createChange({_number: 3 as NumericChangeId}),
      ])
    );

    router.setUrl(createSearchUrl({query: 'asdf'}));
    let view = await assertView('gr-change-list-view');
    assert.equal(assertItems(view).length, 3);

    router.setUrl(createSettingsUrl());
    await assertView('gr-settings-view');

    router.setUrl(createSearchUrl({query: 'asdf'}));
    view = await assertView('gr-change-list-view');
    assert.equal(assertItems(view).length, 3);
  });
});
