/**
 * @license
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import '../../../test/common-test-setup-karma';
import './gr-list-view';
import {GrListView} from './gr-list-view';
import {page} from '../../../utils/page-wrapper-utils';
import {queryAndAssert, stubBaseUrl} from '../../../test/test-utils';
import {GrButton} from '../gr-button/gr-button';
import * as MockInteractions from '@polymer/iron-test-helpers/mock-interactions';

const basicFixture = fixtureFromElement('gr-list-view');

suite('gr-list-view tests', () => {
  let element: GrListView;

  setup(async () => {
    element = basicFixture.instantiate();
    await element.updateComplete;
  });

  test('computeNavLink', () => {
    const offset = 25;
    const projectsPerPage = 25;
    let filter = 'test';
    const path = '/admin/projects';

    stubBaseUrl('');

    assert.equal(
      element.computeNavLink(offset, 1, projectsPerPage, filter, path),
      '/admin/projects/q/filter:test,50'
    );

    assert.equal(
      element.computeNavLink(offset, -1, projectsPerPage, filter, path),
      '/admin/projects/q/filter:test'
    );

    assert.equal(
      element.computeNavLink(offset, 1, projectsPerPage, undefined, path),
      '/admin/projects,50'
    );

    assert.equal(
      element.computeNavLink(offset, -1, projectsPerPage, undefined, path),
      '/admin/projects'
    );

    filter = 'plugins/';
    assert.equal(
      element.computeNavLink(offset, 1, projectsPerPage, filter, path),
      '/admin/projects/q/filter:plugins%252F,50'
    );
  });

  test('_onValueChange', async () => {
    let resolve: (url: string) => void;
    const promise = new Promise(r => (resolve = r));
    element.path = '/admin/projects';
    sinon.stub(page, 'show').callsFake(r => resolve(r));

    element.filter = 'test';
    await element.updateComplete;

    const url = await promise;
    assert.equal(url, '/admin/projects/q/filter:test');
  });

  test('_filterChanged not reload when swap between falsy values', () => {
    const debounceReloadStub = sinon.stub(element, 'debounceReload');
    element.filter = undefined;
    element.filter = '';
    assert.isFalse(debounceReloadStub.called);
  });

  test('next button', async () => {
    element.itemsPerPage = 25;
    let projects = new Array(26);
    await element.updateComplete;

    let loading;
    assert.isFalse(element.hideNextArrow(loading, projects));
    loading = true;
    assert.isTrue(element.hideNextArrow(loading, projects));
    loading = false;
    assert.isFalse(element.hideNextArrow(loading, projects));
    projects = [];
    assert.isTrue(element.hideNextArrow(loading, projects));
    projects = new Array(4);
    assert.isTrue(element.hideNextArrow(loading, projects));
  });

  test('prev button', async () => {
    element.loading = true;
    element.offset = 0;
    await element.updateComplete;
    assert.isTrue(
      queryAndAssert<HTMLAnchorElement>(element, '#prevArrow').hasAttribute(
        'hidden'
      )
    );

    element.loading = false;
    element.offset = 0;
    await element.updateComplete;
    assert.isTrue(
      queryAndAssert<HTMLAnchorElement>(element, '#prevArrow').hasAttribute(
        'hidden'
      )
    );

    element.loading = false;
    element.offset = 5;
    await element.updateComplete;
    assert.isFalse(
      queryAndAssert<HTMLAnchorElement>(element, '#prevArrow').hasAttribute(
        'hidden'
      )
    );
  });

  test('createNew link appears correctly', async () => {
    assert.isFalse(
      queryAndAssert<HTMLDivElement>(
        element,
        '#createNewContainer'
      ).classList.contains('show')
    );
    element.createNew = true;
    await element.updateComplete;
    assert.isTrue(
      queryAndAssert<HTMLDivElement>(
        element,
        '#createNewContainer'
      ).classList.contains('show')
    );
  });

  test('fires create clicked event when button tapped', async () => {
    const clickHandler = sinon.stub();
    element.addEventListener('create-clicked', clickHandler);
    element.createNew = true;
    await element.updateComplete;
    MockInteractions.tap(queryAndAssert<GrButton>(element, '#createNew'));
    assert.isTrue(clickHandler.called);
  });

  test('next/prev links change when path changes', async () => {
    const BRANCHES_PATH = '/path/to/branches';
    const TAGS_PATH = '/path/to/tags';
    const computeNavLinkStub = sinon.stub(element, 'computeNavLink');
    element.offset = 0;
    element.itemsPerPage = 25;
    element.filter = '';
    element.path = BRANCHES_PATH;
    await element.updateComplete;
    assert.equal(computeNavLinkStub.lastCall.args[4], BRANCHES_PATH);
    element.path = TAGS_PATH;
    await element.updateComplete;
    assert.equal(computeNavLinkStub.lastCall.args[4], TAGS_PATH);
  });

  test('computePage', () => {
    assert.equal(element.computePage(0, 25), 1);
    assert.equal(element.computePage(50, 25), 3);
  });
});
