import type { CarWashPayAt, CarwashOrderView, CarwashSettingsView, Tender, VehicleClass, VehicleRead } from "@parking/shared"; import { apiFetch } from "../../api.js"; // The Car Wash module's API client — module-local so apps/web/src/api.ts (the core // client) never learns about wash endpoints. Shapes come from @parking/shared. export type { CarWashPayAt, CarwashOrderView, CarwashSettingsView }; export interface CarwashTicketLookup { identity: string; found: boolean; open: boolean; subscription: boolean; plate: string | null; enteredAt: string | null; currency: string | null; orders: CarwashOrderView[]; /** What the camera saw at entry (advisory) and the category the site mapping * suggests — pre-selected on the desk; the operator may change it. */ vision: VehicleRead | null; suggestedCategoryId: string | null; } export interface CarwashSettingsBody { categories?: { id?: string; name: string; active?: boolean; visionClasses?: VehicleClass[] }[]; services?: { id?: string; name: string; active?: boolean }[]; prices?: { categoryId: string; serviceId: string; priceMinor: number }[]; /** Where wash money is taken at this site (site-level; the desk no longer asks). */ payAt?: CarWashPayAt; /** Confidence floor (0–1) for a vision class to flag a category downgrade. */ visionThreshold?: number; } /** The review outbox's health (Setup → Car wash). */ export interface CarwashReviewStatus { enabled: boolean; boothId: string | null; queued: number; sent: number; failed: number; lastSentAt: string | null; lastError: string | null; } export function fetchCarwashReviewStatus(): Promise { return apiFetch("/api/carwash/review/status"); } export function fetchCarwashSettings(): Promise { return apiFetch("/api/carwash/settings"); } export function saveCarwashSettings(body: CarwashSettingsBody): Promise { return apiFetch("/api/carwash/settings", { method: "PUT", body: JSON.stringify(body) }); } export function lookupCarwashTicket(identity: string): Promise { return apiFetch(`/api/carwash/session/${encodeURIComponent(identity.trim())}`); } export function fetchCarwashOrders(scope: "open" | "recent" = "open"): Promise<{ orders: CarwashOrderView[] }> { return apiFetch(`/api/carwash/orders?scope=${scope}`); } export function createCarwashOrder(body: { identity: string; categoryId: string; serviceId: string; }): Promise { return apiFetch("/api/carwash/orders", { method: "POST", body: JSON.stringify(body) }); } export function markCarwashDone(id: string): Promise { return apiFetch(`/api/carwash/orders/${encodeURIComponent(id)}/done`, { method: "POST" }); } export function payCarwashAtBay(id: string, tender: Tender): Promise { return apiFetch(`/api/carwash/orders/${encodeURIComponent(id)}/pay`, { method: "POST", body: JSON.stringify({ tender }) }); } export function voidCarwashOrder(id: string, reason: string): Promise { return apiFetch(`/api/carwash/orders/${encodeURIComponent(id)}/void`, { method: "POST", body: JSON.stringify({ reason }) }); }