/**
 * @license
 * Copyright 2016 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import {
  createChange,
  createCommit,
  createDownloadInfo,
  createParsedChange,
  createRevision,
} from '../../../test/test-data-generators';
import {
  CommitId,
  NumericChangeId,
  PatchSetNum,
  RepoName,
} from '../../../types/common';
import './gr-download-dialog';
import {GrDownloadDialog} from './gr-download-dialog';
import {mockPromise, queryAll, queryAndAssert} from '../../../test/test-utils';
import {GrDownloadCommands} from '../../shared/gr-download-commands/gr-download-commands';
import {fixture, html, assert} from '@open-wc/testing';
import {GrButton} from '../../shared/gr-button/gr-button';

function getChangeObject() {
  return {
    ...createChange(),
    current_revision: '34685798fe548b6d17d1e8e5edc43a26d055cc72' as CommitId,
    revisions: {
      '34685798fe548b6d17d1e8e5edc43a26d055cc72': {
        ...createRevision(),
        commit: createCommit(),
        fetch: {
          repo: {
            url: 'my.url',
            ref: 'refs/changes/5/6/1',
            commands: {
              repo: 'repo download test-project 5/1',
            },
          },
          ssh: {
            url: 'my.url',
            ref: 'refs/changes/5/6/1',
            commands: {
              Checkout:
                'git fetch ' +
                'ssh://andybons@localhost:29418/test-project ' +
                'refs/changes/05/5/1 && git checkout FETCH_HEAD',
              'Cherry Pick':
                'git fetch ' +
                'ssh://andybons@localhost:29418/test-project ' +
                'refs/changes/05/5/1 && git cherry-pick FETCH_HEAD',
              'Format Patch':
                'git fetch ' +
                'ssh://andybons@localhost:29418/test-project ' +
                'refs/changes/05/5/1 ' +
                '&& git format-patch -1 --stdout FETCH_HEAD',
              Pull:
                'git pull ' +
                'ssh://andybons@localhost:29418/test-project ' +
                'refs/changes/05/5/1',
            },
          },
          http: {
            url: 'my.url',
            ref: 'refs/changes/5/6/1',
            commands: {
              Checkout:
                'git fetch ' +
                'http://andybons@localhost:8080/a/test-project ' +
                'refs/changes/05/5/1 && git checkout FETCH_HEAD',
              'Cherry Pick':
                'git fetch ' +
                'http://andybons@localhost:8080/a/test-project ' +
                'refs/changes/05/5/1 && git cherry-pick FETCH_HEAD',
              'Format Patch':
                'git fetch ' +
                'http://andybons@localhost:8080/a/test-project ' +
                'refs/changes/05/5/1 && ' +
                'git format-patch -1 --stdout FETCH_HEAD',
              Pull:
                'git pull ' +
                'http://andybons@localhost:8080/a/test-project ' +
                'refs/changes/05/5/1',
            },
          },
        },
      },
    },
  };
}

suite('gr-download-dialog', () => {
  let element: GrDownloadDialog;

  setup(async () => {
    element = await fixture(html`<gr-download-dialog></gr-download-dialog>`);
    element.patchNum = 1 as PatchSetNum;
    element.config = createDownloadInfo();
    await element.updateComplete;
  });

  test('render', () => {
    // prettier and shadowDom string don't agree on the long text in the h3
    assert.shadowDom.equal(
      element,
      /* prettier-ignore */ /* HTML */ `
      <section>
        <h3 class="heading-3">
          Patch set 1 of
          0
        </h3>
      </section>
      <section class="hidden">
        <gr-download-commands
          id="downloadCommands"
          show-keyboard-shortcut-tooltips=""
        >
        </gr-download-commands>
      </section>
      <section class="flexContainer">
        <div class="patchFiles">
          <label> Patch file </label>
          <div>
            <a download="" href="" id="download"> </a>
            <a download="" href=""> </a>
          </div>
        </div>
        <div class="archivesContainer">
          <label> Archive </label>
          <div class="archives" id="archives">
            <a download="" href=""> tgz </a>
            <a download="" href=""> tar </a>
          </div>
        </div>
      </section>
      <section class="footer">
        <span class="closeButtonContainer">
          <gr-button
            aria-disabled="false"
            id="closeButton"
            link=""
            role="button"
            tabindex="0"
          >
            Close
          </gr-button>
        </span>
      </section>
    `
    );
  });

  test('anchors use download attribute', () => {
    const anchors = Array.from(queryAll(element, 'a'));
    assert.isTrue(!anchors.some(a => !a.hasAttribute('download')));
  });

  suite('gr-download-dialog tests with no fetch options', () => {
    setup(async () => {
      element.change = {
        ...createParsedChange(),
        revisions: {
          r1: {
            ...createRevision(),
            commit: {
              ...createCommit(),
              parents: [{commit: 'p1' as CommitId, subject: 'subject1'}],
            },
          },
        },
      };
      await element.updateComplete;
    });

    test('focuses on first download link if no copy links', () => {
      const focusStub = sinon.stub(
        queryAndAssert<HTMLAnchorElement>(element, '#download'),
        'focus'
      );
      element.focus();
      assert.isTrue(focusStub.called);
      focusStub.restore();
    });
  });

  suite('gr-download-dialog with fetch options', () => {
    setup(async () => {
      element.change = getChangeObject();
      await element.updateComplete;
    });

    test('focuses on first copy link', async () => {
      const focusStub = sinon.stub(
        queryAndAssert<GrDownloadCommands>(element, '#downloadCommands'),
        'focusOnCopy'
      );
      element.focus();
      await element.updateComplete;
      assert.isTrue(focusStub.called);
      focusStub.restore();
    });

    test('computed fields', () => {
      element.change = {
        ...createParsedChange(),
        project: 'test/project' as RepoName,
        _number: 123 as NumericChangeId,
      };
      element.patchNum = 2 as PatchSetNum;
      assert.equal(
        element.computeArchiveDownloadLink('tgz'),
        '/changes/test%2Fproject~123/revisions/2/archive?format=tgz'
      );
    });

    test('close event', async () => {
      const closeCalled = mockPromise();
      element.addEventListener('close', () => {
        closeCalled.resolve();
      });
      const closeButton = queryAndAssert<GrButton>(
        element,
        '.closeButtonContainer gr-button'
      );
      closeButton.click();
      await closeCalled;
    });
  });

  test('computeHidePatchFile', () => {
    element.patchNum = 1 as PatchSetNum;

    element.change = {
      ...createParsedChange(),
      revisions: {
        r1: {...createRevision(), commit: createCommit()},
      },
    };
    assert.isTrue(element.computeHidePatchFile());

    element.change = {
      ...createParsedChange(),
      revisions: {
        r1: {
          ...createRevision(),
          commit: {
            ...createCommit(),
            parents: [{commit: 'p1' as CommitId, subject: 'subject1'}],
          },
        },
      },
    };
    assert.isFalse(element.computeHidePatchFile());

    element.change = {
      ...createParsedChange(),
      revisions: {
        r1: {
          ...createRevision(),
          commit: {
            ...createCommit(),
            parents: [
              {commit: 'p1' as CommitId, subject: 'subject1'},
              {commit: 'p2' as CommitId, subject: 'subject2'},
            ],
          },
        },
      },
    };
    assert.isTrue(element.computeHidePatchFile());
  });
});
