import apiClient from './apiClient'; export interface Notification { id: number; user_id?: number; notification_type: 'booking_confirmation' | 'payment_receipt' | 'pre_arrival_reminder' | 'check_in_reminder' | 'check_out_reminder' | 'marketing_campaign' | 'loyalty_update' | 'system_alert' | 'custom'; channel: 'email' | 'sms' | 'push' | 'whatsapp' | 'in_app'; subject?: string; content: string; status: 'pending' | 'sent' | 'delivered' | 'failed' | 'read'; priority: string; sent_at?: string; delivered_at?: string; read_at?: string; created_at: string; } export interface NotificationTemplate { id: number; name: string; notification_type: string; channel: string; subject?: string; content: string; variables?: string[]; } export interface NotificationPreferences { email_enabled: boolean; sms_enabled: boolean; push_enabled: boolean; whatsapp_enabled: boolean; in_app_enabled: boolean; booking_confirmation_email: boolean; booking_confirmation_sms: boolean; payment_receipt_email: boolean; payment_receipt_sms: boolean; pre_arrival_reminder_email: boolean; pre_arrival_reminder_sms: boolean; check_in_reminder_email: boolean; check_in_reminder_sms: boolean; check_out_reminder_email: boolean; check_out_reminder_sms: boolean; marketing_campaign_email: boolean; marketing_campaign_sms: boolean; loyalty_update_email: boolean; loyalty_update_sms: boolean; system_alert_email: boolean; system_alert_push: boolean; } export interface SendNotificationRequest { user_id?: number; notification_type: string; channel: string; content: string; subject?: string; template_id?: number; priority?: string; scheduled_at?: string; booking_id?: number; payment_id?: number; meta_data?: Record; } const notificationService = { // Notifications getNotifications: async (params?: { user_id?: number; notification_type?: string; channel?: string; status?: string; skip?: number; limit?: number; }) => { return apiClient.get<{ status: string; data: Notification[] }>('/notifications/', { params }); }, getMyNotifications: async (params?: { status?: string; skip?: number; limit?: number; }) => { // Don't make API call if user is not authenticated const token = localStorage.getItem('token'); if (!token) { throw new Error('Not authenticated'); } return apiClient.get<{ status: string; data: Notification[] }>('/notifications/my-notifications', { params }); }, sendNotification: async (data: SendNotificationRequest) => { return apiClient.post<{ status: string; data: Notification }>('/notifications/send', data); }, markAsRead: async (notificationId: number) => { return apiClient.post<{ status: string; data: Notification }>(`/notifications/${notificationId}/read`); }, // Templates getTemplates: async (params?: { notification_type?: string; channel?: string; }) => { return apiClient.get<{ status: string; data: NotificationTemplate[] }>('/notifications/templates', { params }); }, createTemplate: async (data: { name: string; notification_type: string; channel: string; content: string; subject?: string; variables?: string[]; }) => { return apiClient.post<{ status: string; data: NotificationTemplate }>('/notifications/templates', data); }, // Preferences getPreferences: async () => { return apiClient.get<{ status: string; data: NotificationPreferences }>('/notifications/preferences'); }, updatePreferences: async (data: Partial) => { return apiClient.put<{ status: string; data: NotificationPreferences }>('/notifications/preferences', data); }, }; export default notificationService;