/**
 * @license
 * Copyright 2023 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import './gr-revision-parents';
import {fixture, html, assert} from '@open-wc/testing';
import {GrRevisionParents} from './gr-revision-parents';
import {createRevision} from '../../../test/test-data-generators';
import {
  ChangeId,
  ChangeStatus,
  CommitId,
  NumericChangeId,
  ParentInfo,
  PatchSetNumber,
} from '../../../api/rest-api';
import {queryAll} from '../../../utils/common-util';

const PARENT_DEFAULT: ParentInfo = {
  branch_name: 'refs/heads/master',
  commit_id: '78e52ce873b1c08396422f51ad6aacf77ed95541' as CommitId,
  is_merged_in_target_branch: true,
};

const PARENT_REBASED: ParentInfo = {
  ...PARENT_DEFAULT,
  commit_id: '00002ce873b1c08396422f51ad6aacf77ed95541' as CommitId,
};

const PARENT_OTHER_BRANCH: ParentInfo = {
  ...PARENT_DEFAULT,
  branch_name: 'refs/heads/otherbranch',
  commit_id: '11112ce873b1c08396422f51ad6aacf77ed95541' as CommitId,
};

const PARENT_WEIRD: ParentInfo = {
  ...PARENT_DEFAULT,
  commit_id: '22222ce873b1c08396422f51ad6aacf77ed95541' as CommitId,
  is_merged_in_target_branch: false,
};

const PARENT_CHANGE_123_1: ParentInfo = {
  ...PARENT_DEFAULT,
  commit_id: '12312ce873b1c08396422f51ad6aacf77ed95541' as CommitId,
  is_merged_in_target_branch: false,
  change_id: 'Idc69e6d7bba0ce0a9a0bdcd22adb506c0b76e628' as ChangeId,
  change_number: 123 as NumericChangeId,
  patch_set_number: 1 as PatchSetNumber,
  change_status: ChangeStatus.NEW,
};

const PARENT_CHANGE_123_2: ParentInfo = {
  ...PARENT_CHANGE_123_1,
  commit_id: '12322ce873b1c08396422f51ad6aacf77ed95541' as CommitId,
  patch_set_number: 2 as PatchSetNumber,
};

suite('gr-revision-parents tests', () => {
  let element: GrRevisionParents;

  const setParents = async (
    parentLeft: ParentInfo,
    parentRight: ParentInfo
  ) => {
    element.baseRevision = {
      ...createRevision(1),
      parents_data: [parentLeft],
    };
    element.revision = {
      ...createRevision(2),
      parents_data: [parentRight],
    };
    await element.updateComplete;
  };

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

  test('render empty', () => {
    assert.shadowDom.equal(element, '');
  });

  test('render details: PARENT_DEFAULT', async () => {
    element.showDetails = true;
    await setParents(PARENT_DEFAULT, PARENT_DEFAULT);
    assert.dom.equal(
      queryAll(element, '.section')[0],
      /* HTML */ `
        <div class="section">
          <h4 class="heading-4">Patchset 1</h4>
          <div>Target branch: master</div>
          <div>
            Base commit:
            <gr-commit-info> </gr-commit-info>
          </div>
        </div>
      `
    );
  });

  test('render details: PARENT_WEIRD', async () => {
    element.showDetails = true;
    await setParents(PARENT_WEIRD, PARENT_WEIRD);
    assert.dom.equal(
      queryAll(element, '.section')[0],
      `
        <div class="section">
          <h4 class="heading-4">Patchset 1</h4>
          <div>Target branch: master</div>
          <div>
            Base commit:
            <gr-commit-info> </gr-commit-info>
          </div>
          <div>
            <gr-icon icon="warning"> </gr-icon>
            <span>
              Warning: The base commit is not known (aka reachable) in the
                target branch.
            </span>
          </div>
        </div>
      `
    );
  });

  test('render details: PARENT_CHANGE_123_1', async () => {
    element.showDetails = true;
    await setParents(PARENT_CHANGE_123_1, PARENT_CHANGE_123_2);
    assert.dom.equal(
      queryAll(element, '.section')[0],
      /* HTML */ `
        <div class="section">
          <h4 class="heading-4">Patchset 1</h4>
          <div>Target branch: master</div>
          <div>
            Base commit:
            <gr-commit-info> </gr-commit-info>
          </div>
          <div>
            Base change:
            <a href="/c/123"> 123 </a>
            , patchset
            <a href="/c/123/1"> 1 </a>
          </div>
        </div>
      `
    );
  });

  test('render message PARENT_DEFAULT vs PARENT_DEFAULT', async () => {
    await setParents(PARENT_DEFAULT, PARENT_DEFAULT);
    assert.shadowDom.equal(element, '');
  });

  test('render message PARENT_DEFAULT vs PARENT_OTHER_BRANCH', async () => {
    await setParents(PARENT_DEFAULT, PARENT_OTHER_BRANCH);
    assert.shadowDom.equal(
      element,
      `<div class="messageContainer warning">
       <div class="icon"><gr-icon icon="warning"></gr-icon></div>
       <div class="text"><p>
       Patchset 1 and 2 are targeting different branches.<br/>
       The diff below may not be meaningful and may<br/>
       even be hiding relevant changes.
       <a href="/Documentation/user-review-ui.html#hazardous-rebases">Learn more</a>
       </p><p><gr-button link="">Show details</gr-button></p></div></div>`
    );
  });

  test('render message PARENT_DEFAULT vs PARENT_WEIRD', async () => {
    await setParents(PARENT_DEFAULT, PARENT_WEIRD);
    assert.shadowDom.equal(
      element,
      `<div class="messageContainer warning">
       <div class="icon"><gr-icon icon="warning"></gr-icon></div>
       <div class="text"><p>
       Patchset 2 is based on a commit that neither exists in its
            target branch, nor is it a commit of another active change.<br/>
            The diff below may not be meaningful and may<br/>
            even be hiding relevant changes.
            <a href="/Documentation/user-review-ui.html#hazardous-rebases">Learn more</a>
            </p><p><gr-button link="">Show details</gr-button></p></div></div>`
    );
  });

  test('render message PARENT_DEFAULT vs PARENT_REBASED', async () => {
    await setParents(PARENT_DEFAULT, PARENT_REBASED);
    assert.shadowDom.equal(
      element,
      `<div class="messageContainer info">
       <div class="icon"><gr-icon icon="info"></gr-icon></div>
       <div class="text"><p>
       The change was rebased from <gr-commit-info></gr-commit-info>
       onto <gr-commit-info></gr-commit-info>.
       </p></div></div>`
    );
  });

  test('render message PARENT_CHANGE_123_1 vs PARENT_CHANGE_123_2', async () => {
    await setParents(PARENT_CHANGE_123_1, PARENT_CHANGE_123_2);
    assert.shadowDom.equal(
      element,
      `<div class="messageContainer info">
       <div class="icon"><gr-icon icon="info"></gr-icon></div>
       <div class="text"><p>
       The change was rebased from patchset
       <a href="/c/123/1">1</a> onto
            patchset
       <a href="/c/123/2">2</a> of
            change
       <a href="/c/123">123</a>.
       </p></div></div>`
    );
  });

  test('render message PARENT_DEFAULT vs PARENT_CHANGE_123_1', async () => {
    await setParents(PARENT_DEFAULT, PARENT_CHANGE_123_1);
    assert.shadowDom.equal(
      element,
      `<div class="messageContainer warning">
       <div class="icon"><gr-icon icon="warning"></gr-icon></div>
       <div class="text"><p>
       Patchset 1 is based on commit
       <gr-commit-info></gr-commit-info>
       in the target branch
        (master).<br>
       Patchset 2 is based on patchset
       <a href="/c/123/1">1</a>
       of change
       <a href="/c/123">123</a>.<br>
       The diff below may not be meaningful and may<br/>
       even be hiding relevant changes.
       <a href="/Documentation/user-review-ui.html#hazardous-rebases">Learn more</a>
       </p><p><gr-button link="">Show details</gr-button></p></div></div>`
    );
  });
});
