/**
 * Notification domain entities
 */

export interface Notification {
  id: string;
  userId: string;
  type: NotificationType;
  channel: NotificationChannel;
  title: string;
  message: string;
  data?: Record<string, any>;
  status: NotificationStatus;
  priority: NotificationPriority;
  scheduledAt?: string;
  sentAt?: string;
  readAt?: string;
  createdAt: string;
  updatedAt: string;
}

export type NotificationType =
  | 'order_confirmation'
  | 'order_shipped'
  | 'order_delivered'
  | 'payment_success'
  | 'payment_failed'
  | 'account_created'
  | 'password_reset'
  | 'product_back_in_stock'
  | 'price_drop'
  | 'newsletter'
  | 'promotional'
  | 'system_maintenance'
  | 'security_alert';

export type NotificationChannel =
  | 'email'
  | 'sms'
  | 'push'
  | 'in_app'
  | 'webhook';

export type NotificationStatus =
  | 'pending'
  | 'sent'
  | 'delivered'
  | 'failed'
  | 'cancelled';

export type NotificationPriority =
  | 'low'
  | 'normal'
  | 'high'
  | 'urgent';

export interface NotificationTemplate {
  id: string;
  type: NotificationType;
  channel: NotificationChannel;
  subject: string;
  bodyTemplate: string;
  variables: string[];
  isActive: boolean;
  createdAt: string;
  updatedAt: string;
}

export interface CreateNotificationData {
  userId: string;
  type: NotificationType;
  channel: NotificationChannel;
  title: string;
  message: string;
  data?: Record<string, any>;
  priority?: NotificationPriority;
  scheduledAt?: string;
}

export interface BulkNotificationData {
  userIds: string[];
  type: NotificationType;
  channel: NotificationChannel;
  title: string;
  message: string;
  data?: Record<string, any>;
  priority?: NotificationPriority;
  scheduledAt?: string;
}

export interface NotificationPreferences {
  userId: string;
  email: {
    orderUpdates: boolean;
    promotions: boolean;
    newsletter: boolean;
    securityAlerts: boolean;
  };
  sms: {
    orderUpdates: boolean;
    urgentAlerts: boolean;
  };
  push: {
    orderUpdates: boolean;
    promotions: boolean;
    recommendations: boolean;
  };
  inApp: {
    all: boolean;
  };
  updatedAt: string;
}

export interface NotificationStats {
  sent: number;
  delivered: number;
  failed: number;
  opened: number;
  clicked: number;
  unsubscribed: number;
  deliveryRate: number;
  openRate: number;
  clickRate: number;
}

export interface EmailNotificationData {
  to: string;
  subject: string;
  htmlBody: string;
  textBody?: string;
  attachments?: EmailAttachment[];
}

export interface EmailAttachment {
  filename: string;
  content: string;
  contentType: string;
}

export interface SMSNotificationData {
  to: string;
  message: string;
}

export interface PushNotificationData {
  userId: string;
  title: string;
  body: string;
  icon?: string;
  badge?: number;
  data?: Record<string, any>;
} 