import 'package:flutter/material.dart'; class NotificationModel { final String id; final String type; final String userId; final String? groupId; final String? groupName; final String? paymentId; final String? drawId; final String channel; final String title; final String message; final String status; final int? daysBeforeDue; final String priority; final DateTime? sentAt; final DateTime? readAt; final String? failureReason; final Map? metadata; final DateTime createdAt; final DateTime updatedAt; NotificationModel({ required this.id, required this.type, required this.userId, this.groupId, this.groupName, this.paymentId, this.drawId, required this.channel, required this.title, required this.message, required this.status, this.daysBeforeDue, required this.priority, this.sentAt, this.readAt, this.failureReason, this.metadata, required this.createdAt, required this.updatedAt, }); bool get isUnread => readAt == null && status == 'sent'; bool get isRead => readAt != null; bool get isPending => status == 'pending'; bool get isFailed => status == 'failed'; factory NotificationModel.fromJson(Map json) { return NotificationModel( id: json['id'] ?? '', type: json['type'] ?? '', userId: json['user_id'] ?? '', groupId: json['group_id'], groupName: json['group']?['name'], paymentId: json['payment_id'], drawId: json['draw_id'], channel: json['channel'] ?? '', title: json['title'] ?? '', message: json['message'] ?? '', status: json['status'] ?? 'pending', daysBeforeDue: json['days_before_due'], priority: json['priority'] ?? 'medium', sentAt: json['sent_at'] != null ? DateTime.parse(json['sent_at']) : null, readAt: json['read_at'] != null ? DateTime.parse(json['read_at']) : null, failureReason: json['failure_reason'], metadata: json['metadata'], createdAt: DateTime.parse(json['createdAt'] ?? json['created_at']), updatedAt: DateTime.parse(json['updatedAt'] ?? json['updated_at']), ); } Map toJson() { return { 'id': id, 'type': type, 'user_id': userId, 'group_id': groupId, 'payment_id': paymentId, 'draw_id': drawId, 'channel': channel, 'title': title, 'message': message, 'status': status, 'days_before_due': daysBeforeDue, 'priority': priority, 'sent_at': sentAt?.toIso8601String(), 'read_at': readAt?.toIso8601String(), 'failure_reason': failureReason, 'metadata': metadata, 'createdAt': createdAt.toIso8601String(), 'updatedAt': updatedAt.toIso8601String(), }; } // Get icon based on notification type IconData getIcon() { switch (type) { case 'payment_reminder': case 'payment_overdue': return Icons.payment_rounded; case 'payment_confirmation': return Icons.check_circle_rounded; case 'draw_result': return Icons.casino_rounded; case 'group_invite': return Icons.group_add_rounded; case 'member_joined': return Icons.person_add_rounded; case 'member_removed': return Icons.person_remove_rounded; case 'group_started': case 'group_completed': return Icons.flag_rounded; case 'welcome_message': return Icons.waving_hand_rounded; case 'manager_notification': return Icons.admin_panel_settings_rounded; case 'system_alert': return Icons.warning_rounded; default: return Icons.notifications_rounded; } } // Get color based on notification type Color getColor() { switch (type) { case 'payment_reminder': return const Color(0xFFF57C00); // Orange case 'payment_overdue': return const Color(0xFFD32F2F); // Red case 'payment_confirmation': return const Color(0xFF2E7D32); // Green case 'draw_result': return const Color(0xFF1976D2); // Blue case 'group_invite': case 'member_joined': return const Color(0xFF4CAF50); // Light green case 'member_removed': return const Color(0xFF757575); // Gray case 'group_started': case 'group_completed': return const Color(0xFF7B1FA2); // Purple case 'welcome_message': return const Color(0xFF00BCD4); // Cyan case 'system_alert': return const Color(0xFFFF5722); // Deep orange default: return const Color(0xFF757575); // Gray } } // Get formatted time ago String getTimeAgo() { final now = DateTime.now(); final difference = now.difference(createdAt); if (difference.inSeconds < 60) { return 'Just now'; } else if (difference.inMinutes < 60) { return '${difference.inMinutes}m ago'; } else if (difference.inHours < 24) { return '${difference.inHours}h ago'; } else if (difference.inDays < 7) { return '${difference.inDays}d ago'; } else if (difference.inDays < 30) { return '${(difference.inDays / 7).floor()}w ago'; } else { return '${(difference.inDays / 30).floor()}mo ago'; } } NotificationModel copyWith({ String? id, String? type, String? userId, String? groupId, String? groupName, String? paymentId, String? drawId, String? channel, String? title, String? message, String? status, int? daysBeforeDue, String? priority, DateTime? sentAt, DateTime? readAt, String? failureReason, Map? metadata, DateTime? createdAt, DateTime? updatedAt, }) { return NotificationModel( id: id ?? this.id, type: type ?? this.type, userId: userId ?? this.userId, groupId: groupId ?? this.groupId, groupName: groupName ?? this.groupName, paymentId: paymentId ?? this.paymentId, drawId: drawId ?? this.drawId, channel: channel ?? this.channel, title: title ?? this.title, message: message ?? this.message, status: status ?? this.status, daysBeforeDue: daysBeforeDue ?? this.daysBeforeDue, priority: priority ?? this.priority, sentAt: sentAt ?? this.sentAt, readAt: readAt ?? this.readAt, failureReason: failureReason ?? this.failureReason, metadata: metadata ?? this.metadata, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, ); } }