export const SEMANTIC_MUTATION_KINDS = [
  "flip-persisted-outcome",
  "alter-amount",
  "swap-ownership",
  "illegal-transition",
  "drop-side-effect",
  "invert-authorization-predicate",
] as const;

export type SemanticMutationKind = (typeof SEMANTIC_MUTATION_KINDS)[number];

export type ContractTestResult = {
  testId: string;
  passed: boolean;
  evidence?: Record<string, unknown>;
};

export type ContractTest<T> = {
  id: string;
  contractClass: string;
  run: (impl: T) => Promise<ContractTestResult> | ContractTestResult;
};

export type SemanticMutation<T> = {
  id: string;
  kind: SemanticMutationKind;
  apply: (base: T) => T;
};

export type MutationRoundResult = {
  mutationId: string;
  kind: SemanticMutationKind;
  killed: boolean;
  failedTests: string[];
};

export type MutationCoverageFinding = {
  kind: "surviving-semantic-mutant";
  mutationId: string;
  mutationKind: SemanticMutationKind;
  contractClass: string;
  evidence: {
    passedTests: string[];
  };
};

export type MutationRoundSummary = {
  results: MutationRoundResult[];
  totalMutants: number;
  killedMutants: number;
  score: number;
  coverageFindings: MutationCoverageFinding[];
};

export type RunMutationRoundInput<T> = {
  base: T;
  contractTests: readonly ContractTest<T>[];
  mutations: readonly SemanticMutation<T>[];
};

export type OwnedOracleSpec = {
  scopeId: string;
  oracleId: string;
  contractClass: string;
  assertions: readonly string[];
};

export type ContractMigration = {
  contractId: string;
  contractVersion: string;
  retiredOracleIds: readonly string[];
  reason: string;
};

export type OracleDeletionViolation = {
  scopeId: string;
  oracleId: string;
  contractClass: string;
  reason: "removed" | "weakened";
  removedAssertions?: string[];
};

export type OracleDeletionRatchetInput = {
  baselineOracles: readonly OwnedOracleSpec[];
  currentOracles: readonly OwnedOracleSpec[];
  migrations?: readonly ContractMigration[];
  baseline: import("../../../../core/src/ratchet/baseline.js").Baseline;
  currentRun: import("../../../../core/src/classify/classifier.js").ClassifiedRun;
};

export type OracleDeletionRatchetResult = {
  passes: boolean;
  violations: OracleDeletionViolation[];
  ratchet: import("../../../../core/src/ratchet/ratchet.js").RatchetResult;
  currentRun: import("../../../../core/src/classify/classifier.js").ClassifiedRun;
};

export type CorpusMeasurementInput = {
  contractClass: string;
  round: MutationRoundSummary;
};

export type ContractClassThreshold = {
  contractClass: string;
  measuredScore: number;
  killedMutants: number;
  totalMutants: number;
  threshold: number;
  rationale: string;
};
