import { apiClient } from '@/lib/api-client'; import { PaginatedResponse } from '@edr/types'; // Export apiClient for direct use export { apiClient }; // Bookings API export const bookingsApi = { getAll: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/bookings${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/bookings/${id}`), getMy: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/bookings/my${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getByDevice: async (deviceId: string, params?: any) => { const cleanParams = Object.fromEntries( Object.entries({ ...params }).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; cleanParams['deviceId'] = deviceId; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/bookings/by-device${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, cancel: (id: string, data?: any) => apiClient.post(`/bookings/${id}/cancel`, data), modify: (id: string, data: any) => apiClient.patch(`/bookings/${id}`, data), checkUsage: (id: string) => apiClient.get(`/bookings/${id}/usage`), forceConfirm: (bookingId: string, data: { paymentReference?: string; paymentMethod?: string; notes?: string }) => apiClient.post(`/payments/${bookingId}/force-confirm`, data), }; // Passengers API export const passengersApi = { getAll: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/passengers${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/passengers/${id}`), verify: (nationalId: string) => apiClient.post('/passengers/verify-fayda', { nationalId }), delete: (id: string, cascade?: boolean) => apiClient.delete(`/passengers/${id}${cascade ? '?cascade=true' : ''}`), }; // Stations API export const stationsApi = { getAll: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/stations${query ? `?${query}` : ''}`); // Handle wrapped response: { success, data: [...], timestamp } if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/stations/${id}`), create: (data: any) => apiClient.post('/stations', data), update: (id: string, data: any) => apiClient.patch(`/stations/${id}`, data), delete: (id: string, cascade?: boolean) => apiClient.delete(`/stations/${id}${cascade ? '?cascade=true' : ''}`), }; // Fleet API export const fleetApi = { getTrains: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/fleet/trains${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getCoaches: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/fleet/coaches${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, createTrain: (data: any) => apiClient.post('/fleet/trains', data), updateTrain: (id: string, data: any) => apiClient.patch(`/fleet/trains/${id}`, data), deleteTrain: (id: string, cascade?: boolean) => apiClient.delete(`/fleet/trains/${id}${cascade ? '?cascade=true' : ''}`), restoreTrain: (id: string) => apiClient.patch(`/fleet/trains/${id}/restore`, {}), createCoach: (data: any) => apiClient.post('/fleet/coaches', data), updateCoach: (id: string, data: any) => apiClient.patch(`/fleet/coaches/${id}`, data), deleteCoach: (id: string, cascade?: boolean) => apiClient.delete(`/fleet/coaches/${id}${cascade ? '?cascade=true' : ''}`), generateSeatMap: (data: any) => apiClient.post('/fleet/seatmap/generate', data), getCoach: (id: string) => apiClient.get(`/fleet/coaches/${id}`), }; // Schedules API export const schedulesApi = { getAll: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/schedules${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/schedules/${id}`), create: (data: any) => apiClient.post('/schedules', data), update: (id: string, data: any) => apiClient.patch(`/schedules/${id}`, data), delete: (id: string) => apiClient.delete(`/schedules/${id}`), updateStatus: (id: string, status: string) => apiClient.patch(`/schedules/${id}/status`, { status }), assignCoaches: (scheduleId: string, coaches: Array<{ coachId: string; positionNumber: number }>) => apiClient.post(`/schedules/${scheduleId}/coaches`, { coaches }), getAssignedCoaches: (scheduleId: string) => apiClient.get(`/schedules/${scheduleId}/coaches`), removeCoachAssignment: (scheduleId: string, coachId: string) => apiClient.delete(`/schedules/${scheduleId}/coaches/${coachId}`), }; // Seats API export const seatsApi = { getSeatMap: (scheduleId: string, coachId?: string) => { const params = coachId ? `?coachId=${coachId}` : ''; return apiClient.get(`/seats/seatmap/${scheduleId}${params}`); }, getBySchedule: (scheduleId: string) => apiClient.get(`/seats/schedule/${scheduleId}`), hold: (data: any) => apiClient.post('/seats/hold', data), release: (holdId: string) => apiClient.delete(`/seats/hold/${holdId}`), block: (seatId: string, data: any) => apiClient.post(`/seats/${seatId}/block`, data), unblock: (seatId: string) => apiClient.delete(`/seats/${seatId}/block`), removeSeat: (seatId: string) => apiClient.patch(`/seats/${seatId}/remove`, {}), undoRemove: (seatId: string) => apiClient.patch(`/seats/${seatId}/undo-remove`, {}), setMaintenance: (seatId: string, reason: string) => apiClient.post(`/seats/${seatId}/maintenance`, { reason }), clearMaintenance: (seatId: string) => apiClient.delete(`/seats/${seatId}/maintenance`), }; // Payments API export const paymentsApi = { getAll: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([, v]) => v !== '' && v !== undefined && v !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/payments/all${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/payments/${id}`), refund: (id: string, data: any) => apiClient.post(`/payments/${id}/refund`, data), getProviders: () => apiClient.get('/payments/providers'), getMethods: async () => { const response = await apiClient.get('/payments/methods'); return (response as any)?.data || response || []; }, addMethod: (data: any) => apiClient.post('/payments/methods', data), updateMethod: (id: string, data: any) => apiClient.patch(`/payments/methods/${id}`, data), deleteMethod: (id: string) => apiClient.delete(`/payments/methods/${id}`), }; // Tickets API export const ticketsApi = { getAll: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/tickets${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/tickets/${id}`), validate: (ticketId: string, data: any) => apiClient.post(`/tickets/${ticketId}/validate`, data), scanAndBoard: (qrCodeOrRef: string, data: any) => apiClient.post(`/tickets/scan-board/${encodeURIComponent(qrCodeOrRef)}`, data), regenerate: (ticketId: string) => apiClient.post(`/tickets/${ticketId}/regenerate`), }; // Agents API export const agentsApi = { getAll: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/agents${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/agents/${id}`), create: (data: any) => apiClient.post('/agents', data), update: (id: string, data: any) => apiClient.patch(`/agents/${id}`, data), getShifts: (agentId: string) => apiClient.get(`/agents/${agentId}/shifts`), openShift: (agentId: string, data: any) => apiClient.post(`/agents/${agentId}/shifts/open`, data), closeShift: (shiftId: string, data: any) => apiClient.post(`/agents/shifts/${shiftId}/close`, data), getCommissions: (agentId: string) => apiClient.get(`/agents/${agentId}/commissions`), }; // Loyalty API export const loyaltyApi = { getAccounts: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/loyalty/accounts${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getAccount: (passengerId: string) => apiClient.get(`/loyalty/accounts/${passengerId}`), adjustPoints: (accountId: string, data: any) => apiClient.post(`/loyalty/accounts/${accountId}/adjust`, data), getRewards: () => apiClient.get('/loyalty/rewards'), createReward: (data: any) => apiClient.post('/loyalty/rewards', data), delete: (id: string) => apiClient.delete(`/loyalty/accounts/${id}`), }; // Wallet API export const walletApi = { getAccounts: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/wallet/accounts${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getAccount: (passengerId: string) => apiClient.get(`/wallet/accounts/${passengerId}`), adjustBalance: (accountId: string, data: any) => apiClient.post(`/wallet/accounts/${accountId}/adjust`, data), getLedger: (accountId: string) => apiClient.get(`/wallet/accounts/${accountId}/ledger`), delete: (id: string) => apiClient.delete(`/wallet/accounts/${id}`), }; // Promotions API export const promotionsApi = { getAll: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/promos${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/promos/${id}`), create: (data: any) => apiClient.post('/promos', data), update: (id: string, data: any) => apiClient.patch(`/promos/${id}`, data), delete: (id: string) => apiClient.delete(`/promos/${id}`), }; export { promosApi } from './promos'; export { usersApi } from './users'; // Support API export const supportApi = { getConversations: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/support/conversations${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getConversation: (id: string) => apiClient.get(`/support/conversations/${id}`), updateStatus: (id: string, status: string) => apiClient.patch(`/support/conversations/${id}/status`, { status }), sendMessage: (conversationId: string, data: any) => apiClient.post(`/support/conversations/${conversationId}/messages`, data), getFaqs: () => apiClient.get('/support/faqs'), createFaq: (data: any) => apiClient.post('/support/faqs', data), }; // Notifications API export const notificationsApi = { getTemplates: () => apiClient.get('/notifications/templates'), createTemplate: (data: any) => apiClient.post('/notifications/templates', data), updateTemplate: (id: string, data: any) => apiClient.patch(`/notifications/templates/${id}`, data), send: (data: any) => apiClient.post('/notifications/send', data), getHistory: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/notifications/history${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, }; // Fraud API export const fraudApi = { getAlerts: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([, v]) => v !== '' && v !== undefined && v !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/fraud/alerts${query ? `?${query}` : ''}`); // Backend returns { data: [...], total } or { items: [...] } const arr = (response as any)?.data ?? (response as any)?.items ?? response; return { items: Array.isArray(arr) ? arr : [] }; }, acknowledgeAlert: (id: string) => apiClient.patch(`/fraud/alerts/${id}/acknowledge`), getRules: () => apiClient.get('/fraud/rules'), updateRule: (id: string, data: any) => apiClient.patch(`/fraud/rules/${id}`, data), blockUser: (userId: string, data: any) => apiClient.post(`/fraud/users/${userId}/block`, data), }; // Verifayda API export const verifaydaApi = { getVerifications: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/passengers/verifications${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, verify: (nationalId: string) => apiClient.post('/passengers/verify-fayda', { nationalId }), getStats: () => apiClient.get('/passengers/verification-stats'), }; // Audit API export const auditApi = { getLogs: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/audit/logs${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, getLog: (id: string) => apiClient.get(`/audit/logs/${id}`), }; // Live Tracking API export const liveApi = { getTrips: () => apiClient.get('/live/trips'), getTrip: (tripId: string) => apiClient.get(`/live/trips/${tripId}`), updateLocation: (tripId: string, data: any) => apiClient.post(`/live/trips/${tripId}/location`, data), getCrowdSignals: () => apiClient.get('/live/crowd-signals'), }; // Classes API (formerly Seat Classes) export const seatClassesApi = { getAll: () => apiClient.get('/fleet/classes'), getById: (id: string) => apiClient.get(`/fleet/classes/${id}`), create: (data: any) => apiClient.post('/fleet/classes', data), update: (id: string, data: any) => apiClient.patch(`/fleet/classes/${id}`, data), delete: (id: string, cascade?: boolean) => apiClient.delete(`/fleet/classes/${id}${cascade ? '?cascade=true' : ''}`), }; // Food & Dining API export const foodApi = { getCategories: () => apiClient.get('/food/categories'), getMenuItems: (scheduleId: string) => apiClient.get(`/food/menu/${scheduleId}`), getOrders: async (params?: any) => { const query = new URLSearchParams(params as Record).toString(); const response = await apiClient.get(`/food/orders${query ? `?${query}` : ''}`); if (response?.data) { return Array.isArray(response.data) ? { items: response.data } : response; } return Array.isArray(response) ? { items: response } : response; }, updateOrderStatus: (orderId: string, status: string) => apiClient.patch(`/food/orders/${orderId}/status`, { status }), createMenuItem: (data: any) => apiClient.post('/food/menu-items', data), }; // Reports API export const reportsApi = { generateReport: (data: any) => apiClient.post('/reports/generate', data), getReport: (reportId: string) => apiClient.get(`/reports/${reportId}`), listReports: async (reportType?: string) => { const query = reportType ? `?type=${reportType}` : ''; const response = await apiClient.get(`/reports${query}`); if (Array.isArray(response)) return { items: response }; return (response as any)?.data ? (Array.isArray((response as any).data) ? { items: (response as any).data } : response) : { items: [] }; }, }; // Packages API export const packagesApi = { getAll: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/packages/all${query ? `?${query}` : ''}`); if ((response as any)?.data) return Array.isArray((response as any).data) ? { items: (response as any).data } : response; return Array.isArray(response) ? { items: response } : response; }, getById: (id: string) => apiClient.get(`/packages/${id}`), create: (data: any) => apiClient.post('/packages', data), update: (id: string, data: any) => apiClient.patch(`/packages/${id}`, data), activate: (id: string) => apiClient.patch(`/packages/${id}/activate`, {}), deactivate: (id: string) => apiClient.patch(`/packages/${id}/deactivate`, {}), remove: (id: string, cascade?: boolean) => apiClient.delete(`/packages/${id}${cascade ? '?cascade=true' : ''}`), getBookings: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, value]) => value !== '' && value !== undefined && value !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/packages/bookings${query ? `?${query}` : ''}`); if ((response as any)?.data) return Array.isArray((response as any).data) ? { items: (response as any).data } : response; return Array.isArray(response) ? { items: response } : response; }, addTier: (packageId: string, data: any) => apiClient.post(`/packages/${packageId}/tiers`, data), updateTier: (tierId: string, data: any) => apiClient.patch(`/packages/tiers/${tierId}`, data), deleteTier: (tierId: string) => apiClient.delete(`/packages/tiers/${tierId}`), }; // Package Inquiries API export const packageInquiriesApi = { getAll: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, v]) => v !== '' && v !== undefined && v !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/packages/inquiries${query ? `?${query}` : ''}`); if ((response as any)?.data) return Array.isArray((response as any).data) ? { items: (response as any).data } : response; return Array.isArray(response) ? { items: response } : response; }, create: (data: any) => apiClient.post('/packages/inquiries', data), updateStatus: (id: string, status: string) => apiClient.patch(`/packages/inquiries/${id}/status`, { status }), remove: (id: string) => apiClient.delete(`/packages/inquiries/${id}`), }; // Excess Baggage API export const excessBaggageApi = { logCharge: (data: any) => apiClient.post('/agents/excess-baggage', data), getCharge: (id: string) => apiClient.get(`/agents/excess-baggage/${id}`), getAll: async (params?: any) => { const cleanParams = Object.fromEntries( Object.entries(params || {}).filter(([_, v]) => v !== '' && v !== undefined && v !== null) ) as Record; const query = new URLSearchParams(cleanParams).toString(); const response = await apiClient.get(`/agents/excess-baggage${query ? `?${query}` : ''}`); if ((response as any)?.data) return Array.isArray((response as any).data) ? { items: (response as any).data } : response; return Array.isArray(response) ? { items: response } : response; }, resendLink: (id: string) => apiClient.post(`/agents/excess-baggage/${id}/resend`, {}), waive: (id: string, data: any) => apiClient.patch(`/agents/excess-baggage/${id}/waive`, data), delete: (id: string) => apiClient.delete(`/agents/excess-baggage/${id}`), }; // Segment Fares API export const segmentFaresApi = { getAll: (routeId?: string) => apiClient.get(`/admin/segment-fares${routeId ? `?routeId=${routeId}` : ''}`), create: (data: any) => apiClient.post('/admin/segment-fares', data), update: (id: string, data: any) => apiClient.put(`/admin/segment-fares/${id}`, data), remove: (id: string) => apiClient.delete(`/admin/segment-fares/${id}`), }; // Route Coach Templates API export const routeCoachTemplatesApi = { get: (routeId: string) => apiClient.get(`/routes/${routeId}/coaches`), set: (routeId: string, coaches: Array<{ coachId: string; positionNumber: number }>) => apiClient.put(`/routes/${routeId}/coaches`, { coaches }), clear: (routeId: string) => apiClient.delete(`/routes/${routeId}/coaches`), }; // System Config API export const systemConfigApi = { getAll: () => apiClient.get>('/config'), update: (data: Record) => apiClient.patch>('/config', data), }; // App Releases API export const appReleasesApi = { getAll: async () => { const response = await apiClient.get('/app-releases'); return Array.isArray(response) ? response : (response as any)?.items || (response as any)?.data || []; }, create: (data: any) => apiClient.post('/app-releases', data), update: (id: string, data: any) => apiClient.patch(`/app-releases/${id}`, data), remove: (id: string) => apiClient.delete(`/app-releases/${id}`), };