import * as schema from 'mutation-testing-report-schema/api';

export type { MutantStatus } from 'mutation-testing-report-schema/api';

// We're reusing the `MutantResult` interface here to acquire uniformity.

/**
 * Represents a mutant in its initial state.
 */
export interface Mutant extends Pick<
  schema.MutantResult,
  | 'coveredBy'
  | 'id'
  | 'killedBy'
  | 'location'
  | 'mutatorName'
  | 'replacement'
  | 'static'
  | 'statusReason'
  | 'testsCompleted'
> {
  /**
   * The file name from which this mutant originated
   */
  fileName: string;
  /**
   * Actual mutation that has been applied.
   */
  replacement: string;
  /**
   * The status of a mutant if known. This should be undefined for a mutant that still needs testing.
   */
  status?: schema.MutantStatus;
}

/**
 * Represents a mutant in its matched-with-the-tests state, ready to be tested.
 */
export type MutantTestCoverage = Mutant &
  Pick<schema.MutantResult, 'coveredBy' | 'static'>;

/**
 * Represents a mutant in its final state, ready to be reported.
 */
export type MutantResult = Mutant & schema.MutantResult;
