/**
 * @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 even be hiding
                relevant changes.
       </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 even be hiding
                relevant changes.
       </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 even be hiding
                relevant changes.
       </p><p><gr-button link="">Show details</gr-button></p></div></div>`
    );
  });
});
