import { api as apiClient } from '../auth/http'; import { URL_CONSTANTS } from '@/constants/URLS'; export type RouteStatus = 'AVAILABLE' | 'MAINTENANCE' | 'DAMAGED' | 'STOP_WORKING'; /** Frozen from yard countries: ET→DJ EXPORT, DJ→ET IMPORT, same country DOMESTIC (intercity, disabled). */ export type RouteDirection = 'IMPORT' | 'EXPORT' | 'DOMESTIC'; export interface YardRef { id: string; code: string; label: string; country?: string; } export interface RouteMilestone { id: string; routeId: string; yardId: string; sequenceNo: number; distanceKm?: number | null; yard?: YardRef | null; } export interface RouteRecord { id: string; status: RouteStatus; direction?: RouteDirection; originYardId: string; destinationYardId: string; originYard?: YardRef | null; destinationYard?: YardRef | null; milestones?: RouteMilestone[]; } export interface SaveRoutePayload { milestones: Array<{ yardId: string; distanceKm?: number }>; status?: RouteStatus; } /** * Human-readable route label: yard names, not yard codes. Staff read * "Addis Ababa → Dire Dawa", not "ADDIS_ABABA → DIRE_DAWA". Falls back to the * code only when a yard has no label. */ export function formatRouteLabel(route: RouteRecord): string { const origin = route.originYard?.label ?? route.originYard?.code ?? 'Origin'; const dest = route.destinationYard?.label ?? route.destinationYard?.code ?? 'Destination'; return `${origin} → ${dest}`; } export function totalRouteDistanceKm(route: RouteRecord): number { return (route.milestones ?? []).reduce( (sum, m) => sum + Number(m.distanceKm ?? 0), 0, ); } export const ROUTE_STATUS_OPTIONS: Array<{ value: RouteStatus; label: string }> = [ { value: 'AVAILABLE', label: 'Available' }, { value: 'MAINTENANCE', label: 'Maintenance' }, { value: 'DAMAGED', label: 'Damaged' }, { value: 'STOP_WORKING', label: 'Stop working' }, ]; interface YardListResponse { data: YardRef[]; } export const routesService = { getAll: (params?: { status?: RouteStatus; search?: string }) => apiClient.get(URL_CONSTANTS.ROUTES.BASE, { params }), getById: (id: string) => apiClient.get(URL_CONSTANTS.ROUTES.BY_ID(id)), create: (data: SaveRoutePayload) => apiClient.post(URL_CONSTANTS.ROUTES.BASE, data), update: (id: string, data: Partial) => apiClient.patch(URL_CONSTANTS.ROUTES.BY_ID(id), data), deactivate: (id: string) => apiClient.delete(URL_CONSTANTS.ROUTES.BY_ID(id)), getYards: () => apiClient.get(URL_CONSTANTS.RULE_ENGINE.YARDS, { params: { isActive: true, pageSize: 200 }, }), };