84 lines
2.7 KiB
TypeScript
84 lines
2.7 KiB
TypeScript
import type {
|
|
FlightReportPayload,
|
|
FlightReportStatusResult,
|
|
NormalizedFlightReportRequest
|
|
} from "./types.js";
|
|
import { isPlausibleEmail } from "./input-validation.js";
|
|
|
|
export function getFlightReportStatus(
|
|
normalizedRequest: NormalizedFlightReportRequest,
|
|
payload?: FlightReportPayload | null
|
|
): FlightReportStatusResult {
|
|
if (normalizedRequest.missingSearchInputs.length) {
|
|
return {
|
|
needsMissingInputs: normalizedRequest.missingSearchInputs,
|
|
readyToSearch: false,
|
|
pdfReady: false,
|
|
emailReady: false,
|
|
chatSummaryReady: false,
|
|
terminalOutcome: "missing-inputs",
|
|
degraded: false,
|
|
degradedReasons: [],
|
|
blockingReason: "Missing search-critical trip inputs."
|
|
};
|
|
}
|
|
|
|
if (!payload) {
|
|
return {
|
|
needsMissingInputs: normalizedRequest.missingDeliveryInputs,
|
|
readyToSearch: true,
|
|
pdfReady: false,
|
|
emailReady: false,
|
|
chatSummaryReady: false,
|
|
terminalOutcome: "report-incomplete",
|
|
degraded: false,
|
|
degradedReasons: [],
|
|
lastCompletedPhase: "intake",
|
|
blockingReason: "Search and report assembly have not completed yet."
|
|
};
|
|
}
|
|
|
|
const allSourcesFailed =
|
|
payload.sourceFindings.length > 0 &&
|
|
payload.sourceFindings.every((finding) => finding.status === "blocked") &&
|
|
payload.quotes.length === 0;
|
|
|
|
if (allSourcesFailed) {
|
|
return {
|
|
needsMissingInputs: normalizedRequest.missingDeliveryInputs,
|
|
readyToSearch: true,
|
|
pdfReady: false,
|
|
emailReady: false,
|
|
chatSummaryReady: true,
|
|
terminalOutcome: "all-sources-failed",
|
|
degraded: true,
|
|
degradedReasons: payload.degradedReasons,
|
|
lastCompletedPhase: payload.lastCompletedPhase || "search",
|
|
blockingReason: "All configured travel sources failed or were blocked."
|
|
};
|
|
}
|
|
|
|
const reportComplete = Boolean(
|
|
payload.quotes.length &&
|
|
payload.rankedOptions.length &&
|
|
payload.executiveSummary.length
|
|
);
|
|
const validRecipient = isPlausibleEmail(normalizedRequest.request.recipientEmail);
|
|
|
|
return {
|
|
needsMissingInputs: validRecipient ? [] : normalizedRequest.missingDeliveryInputs,
|
|
readyToSearch: true,
|
|
pdfReady: reportComplete,
|
|
emailReady: reportComplete && validRecipient,
|
|
chatSummaryReady:
|
|
payload.quotes.length > 0 ||
|
|
payload.rankedOptions.length > 0 ||
|
|
payload.executiveSummary.length > 0,
|
|
terminalOutcome: reportComplete ? "ready" : "report-incomplete",
|
|
degraded: payload.degradedReasons.length > 0,
|
|
degradedReasons: payload.degradedReasons,
|
|
lastCompletedPhase: payload.lastCompletedPhase,
|
|
blockingReason: reportComplete ? undefined : "The report payload is still incomplete."
|
|
};
|
|
}
|