import type { PublicRectificationMethod, PublicRectificationTool, RectificationActivityStatus, } from "./rectification-agentic/v9/public-receipt"; export type CompletedActivityReceiptView = Readonly<{ steps: readonly PublicRectificationTool[]; methods: readonly PublicRectificationMethod[]; failedTool?: PublicRectificationTool; }>; type ToolTerminalStatus = "completed" | "failed"; export type RectificationActivityReceiptState = Readonly<{ completedSteps: readonly PublicRectificationTool[]; methods: readonly PublicRectificationMethod[]; terminalStatus: Readonly>>; failureOrder: readonly PublicRectificationTool[]; }>; type ReceiptActivityEvent = Readonly<{ tool: PublicRectificationTool; status: RectificationActivityStatus; methods?: readonly PublicRectificationMethod[]; }>; export function createRectificationActivityReceiptState(): RectificationActivityReceiptState { return { completedSteps: [], methods: [], terminalStatus: {}, failureOrder: [], }; } export function reduceRectificationActivityReceipt( state: RectificationActivityReceiptState, event: ReceiptActivityEvent, ): RectificationActivityReceiptState { if (event.status === "started") return state; const terminalStatus = { ...state.terminalStatus, [event.tool]: event.status }; if (event.status === "completed") { return { completedSteps: state.completedSteps.includes(event.tool) ? state.completedSteps : [...state.completedSteps, event.tool], methods: [...new Set([...state.methods, ...(event.methods ?? [])])], terminalStatus, failureOrder: state.failureOrder.filter((tool) => tool !== event.tool), }; } return { ...state, terminalStatus, failureOrder: [ ...state.failureOrder.filter((tool) => tool !== event.tool), event.tool, ], }; } export function receiptFromRectificationActivityState( state: RectificationActivityReceiptState, ): CompletedActivityReceiptView { const failedTool = [...state.failureOrder] .reverse() .find((tool) => state.terminalStatus[tool] === "failed"); return { steps: [...state.completedSteps], methods: [...state.methods], ...(failedTool ? { failedTool } : {}), }; }