import 'package:equatable/equatable.dart'; import 'novel_structure.dart'; class NovelSummary extends Equatable { const NovelSummary({ required this.id, required this.title, this.coverUrl = '', required this.lastEditTime, this.wordCount = 0, this.readTime = 0, this.version = 1, this.seriesName = '', this.completionPercentage = 0.0, this.lastEditedChapterId, this.author, this.contributors = const [], this.actCount = 0, this.chapterCount = 0, this.sceneCount = 0, this.description = '', required this.serverUpdatedAt, this.localUpdatedAt, this.isCached = false, this.needsSync = false, this.lastReadTime, }); // 从JSON转换方法 factory NovelSummary.fromJson(Map json) { return NovelSummary( id: json['id'], title: json['title'], coverUrl: json['coverUrl'] ?? '', lastEditTime: DateTime.parse(json['lastEditTime']), wordCount: json['wordCount'] ?? 0, readTime: json['readTime'] ?? 0, version: json['version'] ?? 1, seriesName: json['seriesName'] ?? '', completionPercentage: json['completionPercentage']?.toDouble() ?? 0.0, lastEditedChapterId: json['lastEditedChapterId'], author: json['author'], contributors: (json['contributors'] as List?)?.cast() ?? const [], actCount: json['actCount'] ?? 0, chapterCount: json['chapterCount'] ?? 0, sceneCount: json['sceneCount'] ?? 0, description: json['description'] ?? '', serverUpdatedAt: json['serverUpdatedAt'] != null ? DateTime.parse(json['serverUpdatedAt']) : DateTime.parse(json['lastEditTime']), localUpdatedAt: json['localUpdatedAt'] != null ? DateTime.parse(json['localUpdatedAt']) : null, isCached: json['isCached'] ?? false, needsSync: json['needsSync'] ?? false, lastReadTime: json['lastReadTime'] != null ? DateTime.parse(json['lastReadTime']) : null, ); } // 从Novel对象转换方法 factory NovelSummary.fromNovel(Novel novel) { return NovelSummary( id: novel.id, title: novel.title, coverUrl: novel.coverUrl, lastEditTime: novel.updatedAt, wordCount: novel.wordCount, readTime: novel.readTime, version: novel.version, seriesName: '', // Novel中没有seriesName字段,使用空字符串 completionPercentage: 0.0, // 需要计算的字段,暂时设为0 lastEditedChapterId: novel.lastEditedChapterId, author: novel.author?.username, contributors: novel.contributors, actCount: novel.getActCount(), chapterCount: novel.getChapterCount(), sceneCount: novel.getSceneCount(), description: '', // Novel中没有description字段,使用空字符串 serverUpdatedAt: novel.updatedAt, localUpdatedAt: null, // 初始时本地缓存时间为空 isCached: false, // 初始时未缓存 needsSync: false, // 初始时不需要同步 lastReadTime: null, // 初始时没有阅读时间 ); } final String id; final String title; final String coverUrl; final DateTime lastEditTime; final int wordCount; final int readTime; // 估计阅读时间(分钟) final int version; // 文档版本号 final String seriesName; final double completionPercentage; final String? lastEditedChapterId; final String? author; final List contributors; // 贡献者列表 final int actCount; final int chapterCount; final int sceneCount; final String description; // 小说描述 final DateTime serverUpdatedAt; // 服务器端最新更新时间 final DateTime? localUpdatedAt; // 本地缓存的更新时间 final bool isCached; // 是否已在本地完整缓存 final bool needsSync; // 是否需要同步 final DateTime? lastReadTime; // 上次阅读时间 @override List get props => [ id, title, coverUrl, lastEditTime, wordCount, readTime, version, seriesName, completionPercentage, lastEditedChapterId, author, contributors, actCount, chapterCount, sceneCount, description, serverUpdatedAt, localUpdatedAt, isCached, needsSync, lastReadTime, ]; // 转换为JSON方法 Map toJson() { return { 'id': id, 'title': title, 'coverUrl': coverUrl, 'lastEditTime': lastEditTime.toIso8601String(), 'wordCount': wordCount, 'readTime': readTime, 'version': version, 'seriesName': seriesName, 'completionPercentage': completionPercentage, 'lastEditedChapterId': lastEditedChapterId, 'author': author, 'contributors': contributors, 'actCount': actCount, 'chapterCount': chapterCount, 'sceneCount': sceneCount, 'description': description, 'serverUpdatedAt': serverUpdatedAt.toIso8601String(), 'localUpdatedAt': localUpdatedAt?.toIso8601String(), 'isCached': isCached, 'needsSync': needsSync, 'lastReadTime': lastReadTime?.toIso8601String(), }; } // 新增 copyWith 方法,方便状态更新 NovelSummary copyWith({ String? id, String? title, String? coverUrl, DateTime? lastEditTime, int? wordCount, int? readTime, int? version, String? seriesName, double? completionPercentage, String? lastEditedChapterId, String? author, List? contributors, int? actCount, int? chapterCount, int? sceneCount, String? description, DateTime? serverUpdatedAt, DateTime? localUpdatedAt, bool? isCached, bool? needsSync, DateTime? lastReadTime, }) { return NovelSummary( id: id ?? this.id, title: title ?? this.title, coverUrl: coverUrl ?? this.coverUrl, lastEditTime: lastEditTime ?? this.lastEditTime, wordCount: wordCount ?? this.wordCount, readTime: readTime ?? this.readTime, version: version ?? this.version, seriesName: seriesName ?? this.seriesName, completionPercentage: completionPercentage ?? this.completionPercentage, lastEditedChapterId: lastEditedChapterId ?? this.lastEditedChapterId, author: author ?? this.author, contributors: contributors ?? this.contributors, actCount: actCount ?? this.actCount, chapterCount: chapterCount ?? this.chapterCount, sceneCount: sceneCount ?? this.sceneCount, description: description ?? this.description, serverUpdatedAt: serverUpdatedAt ?? this.serverUpdatedAt, localUpdatedAt: localUpdatedAt ?? this.localUpdatedAt, isCached: isCached ?? this.isCached, needsSync: needsSync ?? this.needsSync, lastReadTime: lastReadTime ?? this.lastReadTime, ); } }