/**
 * @license
 * Copyright 2023 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../test/common-test-setup';
import './gr-app';
import {fixture, html, assert} from '@open-wc/testing';
import {GrAppElement} from './gr-app-element';
import {queryAndAssert} from '../utils/common-util';
import {GerritView} from '../services/router/router-model';
import {PluginViewState} from '../models/views/plugin';
import {GrEndpointDecorator} from './plugins/gr-endpoint-decorator/gr-endpoint-decorator';

suite('gr-app-element tests', () => {
  let element: GrAppElement;

  setup(async () => {
    element = await fixture<GrAppElement>(
      html`<gr-app-element></gr-app-element>`
    );
    await element.updateComplete;
  });

  test('renders', () => {
    assert.shadowDom.equal(
      element,
      /* HTML */ `
        <gr-css-mixins> </gr-css-mixins>
        <gr-endpoint-decorator name="banner"> </gr-endpoint-decorator>
        <gr-main-header loggedin id="mainHeader" role="banner">
        </gr-main-header>
        <main>
          <div class="errorView" id="errorView">
            <div class="errorEmoji"></div>
            <div class="errorText"></div>
            <div class="errorMoreInfo"></div>
          </div>
        </main>
        <footer>
          <div>
            Powered by
            <a
              href="https://www.gerritcodereview.com/"
              rel="noopener"
              target="_blank"
            >
              Gerrit Code Review
            </a>
            ()
            <gr-endpoint-decorator name="footer-left"> </gr-endpoint-decorator>
          </div>
          <div>
            Press “?” for keyboard shortcuts
            <gr-endpoint-decorator name="footer-right"> </gr-endpoint-decorator>
          </div>
        </footer>
        <gr-notifications-prompt> </gr-notifications-prompt>
        <gr-endpoint-decorator name="plugin-overlay"> </gr-endpoint-decorator>
        <gr-error-manager id="errorManager"> </gr-error-manager>
        <gr-plugin-host id="plugins"> </gr-plugin-host>
      `
    );
  });

  test('renders plugin screen, changes endpoint instance', async () => {
    element.view = GerritView.PLUGIN_SCREEN;
    element.params = {
      view: GerritView.PLUGIN_SCREEN,
      screen: 'test-screen-1',
      plugin: 'test-plugin',
    } as PluginViewState;
    await element.updateComplete;

    const main1 = queryAndAssert(element, 'main');
    const endpoint1 = queryAndAssert<GrEndpointDecorator>(
      main1,
      'gr-endpoint-decorator'
    );
    assert.equal(endpoint1.name, 'test-plugin-screen-test-screen-1');

    element.params = {
      view: GerritView.PLUGIN_SCREEN,
      screen: 'test-screen-2',
      plugin: 'test-plugin',
    } as PluginViewState;
    await element.updateComplete;

    const main2 = queryAndAssert(element, 'main');
    const endpoint2 = queryAndAssert<GrEndpointDecorator>(
      main2,
      'gr-endpoint-decorator'
    );
    assert.equal(endpoint2.name, 'test-plugin-screen-test-screen-2');

    // Plugin screen endpoints have a variable name. Lit must not re-use the
    // same element instance. (Issue 16884)
    assert.isFalse(endpoint1 === endpoint2);
  });
});
