import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http' import type { PageResult } from './overseasMasterData' import { fleetMoney, fleetNumber, fleetPage, fleetVersion } from './fleetQuotes' export interface FleetSaleQuoteCriteria { customerId: string; originCity: string; destinationCode: string; currency: 'USD' | 'CNY' effectiveOn: string; priceBasis: 'ORDER' | 'PALLET'; page?: number; size?: number } export interface FleetQuoteReference { quoteNo: string; recordVersion: string; priceItem: 'FULL_DELIVERY' | 'LOOSE_DELIVERY' } export interface FleetQuoteSourceSnapshot extends FleetQuoteReference { customerId: string; customerName: string; originCity: string; destinationCode: string; distanceMiles: number currency: 'USD' | 'CNY'; priceBasis: 'ORDER' | 'PALLET'; quotedUnitPrice: number validFrom: string; validTo: string; effectiveOn: string } type Numeric = string | number export type WireSnapshot = Omit & { recordVersion: Numeric; distanceMiles: Numeric; quotedUnitPrice: Numeric } export type WireQuotePage = Omit, 'page' | 'size' | 'total' | 'pages'> & { page: Numeric; size: Numeric; total: Numeric; pages: Numeric } export const normalizeFleetQuoteSource = (row: WireSnapshot): FleetQuoteSourceSnapshot => ({ ...row, recordVersion: fleetVersion(row.recordVersion), distanceMiles: fleetNumber(row.distanceMiles), quotedUnitPrice: fleetMoney(row.quotedUnitPrice) }) export const normalizeFleetQuotePage = (value: WireQuotePage): PageResult => fleetPage({ ...value, records: value.records.map(normalizeFleetQuoteSource) }) /** Only a candidate read: the booking writer must revalidate the reference and freeze its own source snapshot. */ export async function listFleetSaleQuoteCandidates(criteria: FleetSaleQuoteCriteria): Promise> { const response = unwrapApiResponse(await http.get, ApiEnvelope>('/platform/v1/last-leg/fleet/quotes/sale-candidates', { params: criteria })) return normalizeFleetQuotePage(response) } export function fleetQuoteReference(source: FleetQuoteSourceSnapshot): FleetQuoteReference { return { quoteNo: source.quoteNo, recordVersion: source.recordVersion, priceItem: source.priceItem } }