/**
 * @license
 * Copyright 2017 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import './gr-repo-list';
import {GrRepoList} from './gr-repo-list';
import {
  mockPromise,
  queryAndAssert,
  stubRestApi,
} from '../../../test/test-utils';
import {
  UrlEncodedRepoName,
  ProjectInfoWithName,
  RepoName,
} from '../../../types/common';
import {RepoState} from '../../../api/rest-api';
import {GerritView} from '../../../services/router/router-model';
import {GrDialog} from '../../shared/gr-dialog/gr-dialog';
import {GrListView} from '../../shared/gr-list-view/gr-list-view';
import {fixture, html, assert} from '@open-wc/testing';
import {AdminChildView, AdminViewState} from '../../../models/views/admin';
import {testResolver} from '../../../test/common-test-setup';
import {navigationToken} from '../../core/gr-navigation/gr-navigation';

function createRepo(name: string, counter: number) {
  return {
    id: `${name}${counter}` as UrlEncodedRepoName,
    name: `${name}` as RepoName,
    state: 'ACTIVE' as RepoState,
    web_links: [
      {
        name: 'diffusion',
        url: `https://phabricator.example.org/r/project/${name}${counter}`,
      },
    ],
  };
}

function createRepoList(name: string, n: number) {
  const repos = [];
  for (let i = 0; i < n; ++i) {
    repos.push(createRepo(name, i));
  }
  return repos;
}

suite('gr-repo-list tests', () => {
  let element: GrRepoList;
  let repos: ProjectInfoWithName[];

  setup(async () => {
    sinon.stub(testResolver(navigationToken), 'setUrl');
    element = await fixture(html`<gr-repo-list></gr-repo-list>`);
  });

  suite('list with repos', () => {
    setup(async () => {
      repos = createRepoList('test', 26);
      stubRestApi('getRepos').returns(Promise.resolve(repos));
      await element._paramsChanged();
      await element.updateComplete;
    });

    test('render', () => {
      assert.shadowDom.equal(
        element,
        /* HTML */ `
          <gr-list-view>
            <table class="genericList" id="list">
              <tbody>
                <tr class="headerRow">
                  <th class="name topHeader">Repository Name</th>
                  <th class="repositoryBrowser topHeader">
                    Repository Browser
                  </th>
                  <th class="changesLink topHeader">Changes</th>
                  <th class="readOnly topHeader">Read only</th>
                  <th class="description topHeader">Repository Description</th>
                </tr>
                <tr class="loadingMsg" id="loading">
                  <td>Loading...</td>
                </tr>
              </tbody>
              <tbody>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
                <tr class="table">
                  <td class="name">
                    <a href="/admin/repos/test"> test </a>
                  </td>
                  <td class="repositoryBrowser">
                    <gr-weblink imageAndText></gr-weblink>
                  </td>
                  <td class="changesLink">
                    <a href="/q/project:test"> view all </a>
                  </td>
                  <td class="readOnly"></td>
                  <td class="description"></td>
                </tr>
              </tbody>
            </table>
          </gr-list-view>
          <dialog id="createModal" tabindex="-1">
            <gr-dialog
              class="confirmDialog"
              confirm-label="Create"
              disabled=""
              id="createDialog"
              role="dialog"
            >
              <div class="header" slot="header">Create Repository</div>
              <div class="main" slot="main">
                <gr-create-repo-dialog id="createNewModal">
                </gr-create-repo-dialog>
              </div>
            </gr-dialog>
          </dialog>
        `
      );
    });

    test('test for test repo in the list', async () => {
      await element.updateComplete;
      assert.equal(element.repos[0].id, 'test0');
      assert.equal(element.repos[1].id, 'test1');
      assert.equal(element.repos[2].id, 'test2');
    });

    test('shownRepos', () => {
      const table = queryAndAssert(element, 'table');
      const rows = table.querySelectorAll('tr.table');
      assert.equal(rows.length, element.reposPerPage);
    });

    test('maybeOpenCreateModal', () => {
      const modalOpen = sinon.stub(
        queryAndAssert<HTMLDialogElement>(element, '#createModal'),
        'showModal'
      );
      element.maybeOpenCreateModal();
      assert.isFalse(modalOpen.called);
      element.maybeOpenCreateModal(undefined);
      assert.isFalse(modalOpen.called);
      const params: AdminViewState = {
        view: GerritView.ADMIN,
        adminView: AdminChildView.REPOS,
        openCreateModal: true,
      };
      element.maybeOpenCreateModal(params);
      assert.isTrue(modalOpen.called);
    });
  });

  suite('list with less then 25 repos', () => {
    setup(async () => {
      repos = createRepoList('test', 25);
      stubRestApi('getRepos').returns(Promise.resolve(repos));
      await element._paramsChanged();
      await element.updateComplete;
    });

    test('shownRepos', () => {
      const table = queryAndAssert(element, 'table');
      const rows = table.querySelectorAll('tr.table');
      assert.equal(rows.length, element.reposPerPage);
    });
  });

  suite('filter', () => {
    let reposFiltered: ProjectInfoWithName[];

    setup(() => {
      repos = createRepoList('test', 25);
      reposFiltered = createRepoList('filter', 1);
    });

    test('_paramsChanged', async () => {
      const repoStub = stubRestApi('getRepos');
      repoStub.returns(Promise.resolve(repos));
      element.params = {
        view: GerritView.ADMIN,
        adminView: AdminChildView.REPOS,
        filter: 'test',
        offset: 25,
      } as AdminViewState;
      await element._paramsChanged();
      assert.isTrue(repoStub.lastCall.calledWithExactly('test', 25, 25));
    });

    test('latest repos requested are always set', async () => {
      const repoStub = stubRestApi('getRepos');
      const promise = mockPromise<ProjectInfoWithName[]>();
      repoStub.withArgs('filter', 25).returns(promise);

      element.filter = 'test';
      element.reposPerPage = 25;
      element.offset = 0;

      // Repos are not set because the element.filter differs.
      const p = element.getRepos();
      element.filter = 'filter';
      promise.resolve(reposFiltered);
      await p;
      assert.deepEqual(element.repos, []);
    });

    test('filter is case insensitive', async () => {
      const repoStub = stubRestApi('getRepos');
      const repos = [createRepo('aSDf', 0)];
      repoStub.withArgs('asdf', 25).returns(Promise.resolve(repos));

      element.filter = 'asdf';
      element.reposPerPage = 25;
      element.offset = 0;

      await element.getRepos();
      assert.equal(element.repos.length, 1);
    });

    test('display repos by query search', async () => {
      const repoStub = stubRestApi('getRepos');
      const repos = [createRepo('test', 0)];
      repoStub.withArgs('inname:test', 25).returns(Promise.resolve(repos));
      element.filter = 'inname:test';
      element.reposPerPage = 25;
      element.offset = 0;
      await element.getRepos();
      assert.equal(element.repos.length, 1);
    });
  });

  suite('loading', () => {
    test('correct contents are displayed', async () => {
      assert.isTrue(element.loading);
      assert.equal(element.computeLoadingClass(element.loading), 'loading');
      assert.equal(
        getComputedStyle(
          queryAndAssert<HTMLTableRowElement>(element, '#loading')
        ).display,
        'block'
      );

      element.loading = false;
      element.repos = createRepoList('test', 25);

      await element.updateComplete;
      assert.equal(element.computeLoadingClass(element.loading), '');
      assert.equal(
        getComputedStyle(
          queryAndAssert<HTMLTableRowElement>(element, '#loading')
        ).display,
        'none'
      );
    });
  });

  suite('create new', () => {
    test('handleCreateClicked called when create-clicked fired', () => {
      const handleCreateClickedStub = sinon.stub(
        element,
        'handleCreateClicked'
      );
      queryAndAssert<GrListView>(element, 'gr-list-view').dispatchEvent(
        new CustomEvent('create-clicked', {
          composed: true,
          bubbles: true,
        })
      );
      assert.isTrue(handleCreateClickedStub.called);
    });

    test('handleCreateClicked opens modal', () => {
      const openStub = sinon.stub(
        queryAndAssert<HTMLDialogElement>(element, '#createModal'),
        'showModal'
      );
      element.handleCreateClicked();
      assert.isTrue(openStub.called);
    });

    test('handleCreateRepo called when confirm fired', () => {
      const handleCreateRepoStub = sinon.stub(element, 'handleCreateRepo');
      queryAndAssert<GrDialog>(element, '#createDialog').dispatchEvent(
        new CustomEvent('confirm', {
          composed: true,
          bubbles: false,
        })
      );
      assert.isTrue(handleCreateRepoStub.called);
    });

    test('handleCloseCreate called when cancel fired', () => {
      const handleCloseCreateStub = sinon.stub(element, 'handleCloseCreate');
      queryAndAssert<GrDialog>(element, '#createDialog').dispatchEvent(
        new CustomEvent('cancel', {
          composed: true,
          bubbles: false,
        })
      );
      assert.isTrue(handleCloseCreateStub.called);
    });
  });
});
