/**
 * @license
 * Copyright (C) 2021 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 {fixture} from '@open-wc/testing-helpers';
import {html} from 'lit';
import './gr-submit-requirements';
import {GrSubmitRequirements} from './gr-submit-requirements';
import {
  createAccountWithIdNameAndEmail,
  createApproval,
  createDetailedLabelInfo,
  createParsedChange,
  createSubmitRequirementExpressionInfo,
  createSubmitRequirementResultInfo,
  createNonApplicableSubmitRequirementResultInfo,
  createRunResult,
  createCheckResult,
} from '../../../test/test-data-generators';
import {
  SubmitRequirementResultInfo,
  SubmitRequirementStatus,
} from '../../../api/rest-api';
import {ParsedChangeInfo} from '../../../types/types';
import {RunStatus} from '../../../api/checks';

suite('gr-submit-requirements tests', () => {
  let element: GrSubmitRequirements;
  let change: ParsedChangeInfo;
  setup(async () => {
    const submitRequirement: SubmitRequirementResultInfo = {
      ...createSubmitRequirementResultInfo(),
      description: 'Test Description',
      submittability_expression_result: createSubmitRequirementExpressionInfo(),
    };
    change = {
      ...createParsedChange(),
      submit_requirements: [
        submitRequirement,
        createNonApplicableSubmitRequirementResultInfo(),
      ],
      labels: {
        Verified: {
          ...createDetailedLabelInfo(),
          all: [
            {
              ...createApproval(),
              value: 2,
            },
          ],
        },
      },
    };
    const account = createAccountWithIdNameAndEmail();
    element = await fixture<GrSubmitRequirements>(
      html`<gr-submit-requirements
        .change=${change}
        .account=${account}
      ></gr-submit-requirements>`
    );
  });

  test('renders', () => {
    expect(element).shadowDom.to.equal(/* HTML */ `
      <h3 class="heading-3 metadata-title" id="submit-requirements-caption">
        Submit Requirements
      </h3>
      <table aria-labelledby="submit-requirements-caption" class="requirements">
        <thead hidden="">
          <tr>
            <th>Status</th>
            <th>Name</th>
            <th>Votes</th>
          </tr>
        </thead>
        <tbody>
          <tr id="requirement-0-Verified" role="button" tabindex="0">
            <td>
              <iron-icon
                aria-label="satisfied"
                class="check-circle-filled"
                icon="gr-icons:check-circle-filled"
                role="img"
              >
              </iron-icon>
            </td>
            <td class="name">
              <gr-limited-text class="name" limit="25"></gr-limited-text>
            </td>
            <td>
              <gr-endpoint-decorator
                class="votes-cell"
                name="submit-requirement-verified"
              >
                <gr-endpoint-param name="change"></gr-endpoint-param>
                <gr-endpoint-param name="requirement"></gr-endpoint-param>
                <gr-vote-chip></gr-vote-chip>
              </gr-endpoint-decorator>
            </td>
          </tr>
        </tbody>
      </table>
      <gr-submit-requirement-hovercard for="requirement-0-Verified">
      </gr-submit-requirement-hovercard>
    `);
  });

  suite('votes-cell', () => {
    setup(async () => {
      element.disableEndpoints = true;
      await element.updateComplete;
    });
    test('with vote', () => {
      const votesCell = element.shadowRoot?.querySelectorAll('.votes-cell');
      expect(votesCell?.[0]).dom.equal(/* HTML */ `
        <div class="votes-cell">
          <gr-vote-chip> </gr-vote-chip>
        </div>
      `);
    });

    test('no votes', async () => {
      const modifiedChange = {...change};
      modifiedChange.labels = {
        Verified: {
          ...createDetailedLabelInfo(),
        },
      };
      element.change = modifiedChange;
      await element.updateComplete;
      const votesCell = element.shadowRoot?.querySelectorAll('.votes-cell');
      expect(votesCell?.[0]).dom.equal(/* HTML */ `
        <div class="votes-cell">No votes</div>
      `);
    });

    test('without label to vote on', async () => {
      const modifiedChange = {...change};
      modifiedChange.submit_requirements![0]!.submittability_expression_result.expression =
        'hasfooter:"Release-Notes"';
      element.change = modifiedChange;
      await element.updateComplete;
      const votesCell = element.shadowRoot?.querySelectorAll('.votes-cell');
      expect(votesCell?.[0]).dom.equal(/* HTML */ `
        <div class="votes-cell">Satisfied</div>
      `);
    });

    test('checks', async () => {
      element.runs = [
        {
          ...createRunResult(),
          labelName: 'Verified',
          results: [createCheckResult()],
        },
      ];
      await element.updateComplete;
      const votesCell = element.shadowRoot?.querySelectorAll('.votes-cell');
      expect(votesCell?.[0]).dom.equal(/* HTML */ `
        <div class="votes-cell">
          <gr-vote-chip></gr-vote-chip>
          <gr-checks-chip></gr-checks-chip>
        </div>
      `);
    });

    test('running checks', async () => {
      element.runs = [
        {
          ...createRunResult(),
          status: RunStatus.RUNNING,
          labelName: 'Verified',
          results: [createCheckResult()],
        },
      ];
      await element.updateComplete;
      const votesCell = element.shadowRoot?.querySelectorAll('.votes-cell');
      expect(votesCell?.[0]).dom.equal(/* HTML */ `
        <div class="votes-cell">
          <gr-vote-chip></gr-vote-chip>
          <gr-checks-chip></gr-checks-chip>
        </div>
      `);
    });

    test('with override label', async () => {
      const modifiedChange = {...change};
      modifiedChange.labels = {
        Override: {
          ...createDetailedLabelInfo(),
          all: [
            {
              ...createApproval(),
              value: 2,
            },
          ],
        },
      };
      modifiedChange.submit_requirements = [
        {
          ...createSubmitRequirementResultInfo(),
          status: SubmitRequirementStatus.OVERRIDDEN,
          override_expression_result: createSubmitRequirementExpressionInfo(
            'label:Override=MAX -label:Override=MIN'
          ),
        },
      ];
      element.change = modifiedChange;
      await element.updateComplete;
      const votesCell = element.shadowRoot?.querySelectorAll('.votes-cell');
      expect(votesCell?.[0]).dom.equal(/* HTML */ `<div class="votes-cell">
        <gr-vote-chip> </gr-vote-chip>
        <span class="overrideLabel"> Override </span>
      </div>`);
    });

    test('with override with 2 labels', async () => {
      const modifiedChange = {...change};
      modifiedChange.labels = {
        Override: {
          ...createDetailedLabelInfo(),
          all: [
            {
              ...createApproval(),
              value: 2,
            },
          ],
        },
        Override2: {
          ...createDetailedLabelInfo(),
          all: [
            {
              ...createApproval(),
              value: 2,
            },
          ],
        },
      };
      modifiedChange.submit_requirements = [
        {
          ...createSubmitRequirementResultInfo(),
          status: SubmitRequirementStatus.OVERRIDDEN,
          override_expression_result: createSubmitRequirementExpressionInfo(
            'label:Override=MAX label:Override2=MAX'
          ),
        },
      ];
      element.change = modifiedChange;
      await element.updateComplete;
      const votesCell = element.shadowRoot?.querySelectorAll('.votes-cell');
      expect(votesCell?.[0]).dom.equal(/* HTML */ `<div class="votes-cell">
        <gr-vote-chip> </gr-vote-chip>
        <span class="overrideLabel"> Override </span>
        <span class="separator"></span>
        <gr-vote-chip> </gr-vote-chip>
        <span class="overrideLabel"> Override2 </span>
      </div>`);
    });
  });

  test('calculateEndpointName()', () => {
    assert.equal(
      element.calculateEndpointName('code-owners~CodeOwnerSub'),
      'submit-requirement-codeowners'
    );
  });
});
