export type RuntimeReferenceKind =
  | "route"
  | "asset"
  | "module-export"
  | "peer-dependency"
  | "binding"
  | "migration"
  | "queue"
  | "script"
  | "executable"
  | "config-path";

export type RuntimeReference = {
  referenceId: string;
  kind: RuntimeReferenceKind;
  target: string;
  packagedEnvironment: string;
  resolved: boolean;
  resolutionError?: string;
};

export type RuntimeReferenceScenario = {
  scenarioId: string;
  kind: "runtime-reference";
  references: RuntimeReference[];
};

export type CurrentBuildInputs = {
  sourceRevision: string;
  configDigest: string;
  lockDigest: string;
};

export type ArtifactStatus =
  | "current"
  | "stale"
  | "mixed-tree"
  | "duplicated"
  | "missing"
  | "untracked";

export type ArtifactRecord = {
  artifactId: string;
  path: string;
  present: boolean;
  status: ArtifactStatus;
  derivedFrom?: CurrentBuildInputs;
  detail?: string;
};

export type ArtifactClosureScenario = {
  scenarioId: string;
  kind: "artifact-closure";
  currentInputs: CurrentBuildInputs;
  artifacts: ArtifactRecord[];
};

export type InventoryProvenanceKind =
  | "production"
  | "test"
  | "fixture"
  | "generated"
  | "dependency"
  | "source-only";

export type InventoryEntry = {
  surfaceId: string;
  path: string;
  actualProvenance: InventoryProvenanceKind;
  declaredProvenance?: InventoryProvenanceKind;
  includedInProductionInventory: boolean;
};

export type InventoryProvenanceScenario = {
  scenarioId: string;
  kind: "inventory-provenance";
  entries: InventoryEntry[];
};

export type ClosureScenario =
  | RuntimeReferenceScenario
  | ArtifactClosureScenario
  | InventoryProvenanceScenario;

export type ClosureFixture = {
  fixtureId: string;
  closureVersion: string;
  scenarios: ClosureScenario[];
  intentionalException?: {
    rules: string[];
    reason: string;
  };
};
