export type StateTransition = {
  from: string;
  event: string;
  to: string;
};

export type FieldSensitivity = "non-sensitive" | "sensitive";

export type ConfirmedTransition = "consume" | "clear";

export type FormField = {
  fieldId: string;
  enteredValue: unknown;
  sensitivity: FieldSensitivity;
  confirmedTransition?: ConfirmedTransition;
};

export type SubmissionOutcome = "success" | "failed" | "rejected";

export type ObservedFieldValue = {
  fieldId: string;
  value: unknown;
};

export type FormSubmissionScenario = {
  scenarioId: string;
  kind: "form-submission";
  submissionOutcome: SubmissionOutcome;
  fields: FormField[];
  observedAfterSubmission: ObservedFieldValue[];
  stateTrace?: StateTransition[];
};

export type InteractionOutcome = "completed" | "canceled" | "prevented";

export type SideEffectKind = "navigation" | "progress" | "mutation" | "analytics" | "success";

export type SideEffectScope = "parent" | "derived" | "nested";

export type InteractionSideEffect = {
  effectId: string;
  kind: SideEffectKind;
  scope: SideEffectScope;
  tiedToDefaultAction: boolean;
  emitted: boolean;
};

export type CanceledInteractionScenario = {
  scenarioId: string;
  kind: "canceled-interaction";
  parentState: string;
  interactionOutcome: InteractionOutcome;
  defaultActionId: string;
  sideEffects: InteractionSideEffect[];
  stateTrace?: StateTransition[];
};

export type ContinuityScenario = FormSubmissionScenario | CanceledInteractionScenario;

export type ContinuityFixture = {
  fixtureId: string;
  continuityVersion: string;
  scenarios: ContinuityScenario[];
  intentionalException?: {
    rules: string[];
    reason: string;
  };
};
