/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */

/**
 * Class that can be used to describe pull request failures. A failure
 * is described through a human-readable message and a flag indicating
 * whether it is non-fatal or not.
 */
export class PullRequestFailure {
  constructor(
      /** Human-readable message for the failure */
      public message: string,
      /** Whether the failure is non-fatal and can be forcibly ignored. */
      public nonFatal = false) {}

  static claUnsigned() {
    return new this(`CLA has not been signed. Please make sure the PR author has signed the CLA.`);
  }

  static failingCiJobs() {
    return new this(`Failing CI jobs.`, true);
  }

  static pendingCiJobs() {
    return new this(`Pending CI jobs.`, true);
  }

  static notMergeReady() {
    return new this(`Not marked as merge ready.`);
  }

  static noTargetLabel() {
    return new this(`No target branch could be determined. Please ensure a target label is set.`);
  }

  static mismatchingTargetBranch(allowedBranches: string[]) {
    return new this(
        `Pull request is set to wrong base branch. Please update the PR in the Github UI ` +
        `to one of the following branches: ${allowedBranches.join(', ')}.`);
  }

  static unsatisfiedBaseSha() {
    return new this(
        `Pull request has not been rebased recently and could be bypassing CI checks. ` +
        `Please rebase the PR.`);
  }

  static mergeConflicts(failedBranches: string[]) {
    return new this(
        `Could not merge pull request into the following branches due to merge ` +
        `conflicts: ${
            failedBranches.join(', ')}. Please rebase the PR or update the target label.`);
  }

  static unknownMergeError() {
    return new this(`Unknown merge error occurred. Please see console output above for debugging.`);
  }

  static unableToFixupCommitMessageSquashOnly() {
    return new this(
        `Unable to fixup commit message of pull request. Commit message can only be ` +
        `modified if the PR is merged using squash.`);
  }

  static notFound() {
    return new this(`Pull request could not be found upstream.`);
  }

  static insufficientPermissionsToMerge(
      message = `Insufficient Github API permissions to merge pull request. Please ensure that ` +
          `your auth token has write access.`) {
    return new this(message);
  }
}
