class UserSettings { final String userId; final String theme; final String language; final bool notificationsEnabled; final bool emailNotifications; final bool pushNotifications; final String contentFilterLevel; final bool autoPlayVideos; final bool dataSaverMode; final int? defaultPostTtl; final bool nsfwEnabled; final bool nsfwBlurEnabled; const UserSettings({ required this.userId, this.theme = 'system', this.language = 'en', this.notificationsEnabled = true, this.emailNotifications = true, this.pushNotifications = true, this.contentFilterLevel = 'medium', this.autoPlayVideos = true, this.dataSaverMode = false, this.defaultPostTtl, this.nsfwEnabled = false, this.nsfwBlurEnabled = true, }); factory UserSettings.fromJson(Map json) { return UserSettings( userId: json['user_id'] as String, theme: json['theme'] as String? ?? 'system', language: json['language'] as String? ?? 'en', notificationsEnabled: json['notifications_enabled'] as bool? ?? true, emailNotifications: json['email_notifications'] as bool? ?? true, pushNotifications: json['push_notifications'] as bool? ?? true, contentFilterLevel: json['content_filter_level'] as String? ?? 'medium', autoPlayVideos: json['auto_play_videos'] as bool? ?? true, dataSaverMode: json['data_saver_mode'] as bool? ?? false, defaultPostTtl: _parseIntervalHours(json['default_post_ttl']), nsfwEnabled: json['nsfw_enabled'] as bool? ?? false, nsfwBlurEnabled: json['nsfw_blur_enabled'] as bool? ?? true, ); } Map toJson() { return { 'user_id': userId, 'theme': theme, 'language': language, 'notifications_enabled': notificationsEnabled, 'email_notifications': emailNotifications, 'push_notifications': pushNotifications, 'content_filter_level': contentFilterLevel, 'auto_play_videos': autoPlayVideos, 'data_saver_mode': dataSaverMode, 'default_post_ttl': defaultPostTtl, 'nsfw_enabled': nsfwEnabled, 'nsfw_blur_enabled': nsfwBlurEnabled, }; } UserSettings copyWith({ String? theme, String? language, bool? notificationsEnabled, bool? emailNotifications, bool? pushNotifications, String? contentFilterLevel, bool? autoPlayVideos, bool? dataSaverMode, int? defaultPostTtl, bool? nsfwEnabled, bool? nsfwBlurEnabled, }) { return UserSettings( userId: userId, theme: theme ?? this.theme, language: language ?? this.language, notificationsEnabled: notificationsEnabled ?? this.notificationsEnabled, emailNotifications: emailNotifications ?? this.emailNotifications, pushNotifications: pushNotifications ?? this.pushNotifications, contentFilterLevel: contentFilterLevel ?? this.contentFilterLevel, autoPlayVideos: autoPlayVideos ?? this.autoPlayVideos, dataSaverMode: dataSaverMode ?? this.dataSaverMode, defaultPostTtl: defaultPostTtl ?? this.defaultPostTtl, nsfwEnabled: nsfwEnabled ?? this.nsfwEnabled, nsfwBlurEnabled: nsfwBlurEnabled ?? this.nsfwBlurEnabled, ); } static int? _parseIntervalHours(dynamic value) { if (value == null) return null; if (value is int) return value; if (value is double) return value.round(); if (value is String) { final trimmed = value.trim(); if (trimmed.isEmpty) return null; final dayMatch = RegExp(r'(\d+)\s+day').firstMatch(trimmed); final hourMatch = RegExp(r'(\d+)\s+hour').firstMatch(trimmed); final timeMatch = RegExp(r'(\d{1,2}):(\d{2}):(\d{2})').firstMatch(trimmed); var totalHours = 0; if (dayMatch != null) { totalHours += (int.tryParse(dayMatch.group(1) ?? '') ?? 0) * 24; } if (timeMatch != null) { totalHours += int.tryParse(timeMatch.group(1) ?? '') ?? 0; } else if (hourMatch != null) { totalHours += int.tryParse(hourMatch.group(1) ?? '') ?? 0; } return totalHours == 0 ? null : totalHours; } return null; } }