import '../models/writing_task.dart'; import '../models/writing_submission.dart'; import '../models/writing_stats.dart'; import '../../../core/network/api_client.dart'; import '../../../core/network/api_endpoints.dart'; import '../../../core/services/enhanced_api_service.dart'; import '../../../core/models/api_response.dart'; import '../models/writing_task.dart'; import '../models/writing_submission.dart'; import '../models/writing_stats.dart'; /// 写作训练服务 class WritingService { final EnhancedApiService _enhancedApiService = EnhancedApiService(); // 缓存时长配置 static const Duration _shortCacheDuration = Duration(minutes: 5); static const Duration _longCacheDuration = Duration(hours: 1); /// 获取写作任务列表 Future> getWritingTasks({ WritingType? type, WritingDifficulty? difficulty, int page = 1, int limit = 20, bool forceRefresh = false, }) async { try { final response = await _enhancedApiService.get>( ApiEndpoints.writingPrompts, queryParameters: { 'page': page, 'limit': limit, if (type != null) 'type': type.name, if (difficulty != null) 'difficulty': difficulty.name, }, useCache: !forceRefresh, cacheDuration: _shortCacheDuration, fromJson: (data) { final List list = data['data'] ?? []; return list.map((json) => WritingTask.fromJson(json)).toList(); }, ); if (response.success && response.data != null) { return response.data!; } else { throw Exception(response.message); } } catch (e) { throw Exception('获取写作任务失败: $e'); } } /// 获取单个写作任务详情 Future getWritingTask(String taskId) async { try { final response = await _enhancedApiService.get( '${ApiEndpoints.writingPrompts}/$taskId', cacheDuration: _longCacheDuration, fromJson: (data) => WritingTask.fromJson(data['data']), ); if (response.success && response.data != null) { return response.data!; } else { throw Exception(response.message); } } catch (e) { throw Exception('获取写作任务详情失败: $e'); } } /// 提交写作作业 Future submitWriting({ required String taskId, required String userId, required String content, required int timeSpent, required int wordCount, }) async { try { final response = await _enhancedApiService.post( ApiEndpoints.writingSubmissions, data: { 'prompt_id': taskId, 'user_id': userId, 'content': content, 'time_spent': timeSpent, 'word_count': wordCount, }, fromJson: (data) => WritingSubmission.fromJson(data['data']), ); if (response.success && response.data != null) { return response.data!; } else { throw Exception(response.message); } } catch (e) { throw Exception('提交写作作业失败: $e'); } } /// 获取用户写作历史 Future> getUserWritingHistory({ required String userId, int page = 1, int limit = 20, bool forceRefresh = false, }) async { try { final response = await _enhancedApiService.get>( ApiEndpoints.writingSubmissions, queryParameters: { 'page': page, 'limit': limit, }, useCache: !forceRefresh, cacheDuration: _shortCacheDuration, fromJson: (data) { final List list = data['data'] ?? []; return list.map((json) => WritingSubmission.fromJson(json)).toList(); }, ); if (response.success && response.data != null) { return response.data!; } else { throw Exception(response.message); } } catch (e) { throw Exception('获取写作历史失败: $e'); } } /// 获取用户写作统计 Future getUserWritingStats(String userId, {bool forceRefresh = false}) async { try { final response = await _enhancedApiService.get( ApiEndpoints.writingStats, useCache: !forceRefresh, cacheDuration: _shortCacheDuration, fromJson: (data) => WritingStats.fromJson(data['data']), ); if (response.success && response.data != null) { return response.data!; } else { throw Exception(response.message); } } catch (e) { throw Exception('获取写作统计失败: $e'); } } /// 获取写作反馈 Future getWritingFeedback(String submissionId) async { try { final response = await _enhancedApiService.get( '${ApiEndpoints.writingSubmissions}/$submissionId', cacheDuration: _shortCacheDuration, fromJson: (data) => WritingSubmission.fromJson(data['data']), ); if (response.success && response.data != null) { return response.data!; } else { throw Exception(response.message); } } catch (e) { throw Exception('获取写作反馈失败: $e'); } } /// 搜索写作任务 Future> searchWritingTasks({ required String query, WritingType? type, WritingDifficulty? difficulty, int page = 1, int limit = 20, bool forceRefresh = false, }) async { try { final response = await _enhancedApiService.get>( '${ApiEndpoints.writingPrompts}/search', queryParameters: { 'q': query, 'page': page, 'limit': limit, if (type != null) 'type': type.name, if (difficulty != null) 'difficulty': difficulty.name, }, useCache: !forceRefresh, cacheDuration: _shortCacheDuration, fromJson: (data) { final List list = data['data'] ?? []; return list.map((json) => WritingTask.fromJson(json)).toList(); }, ); if (response.success && response.data != null) { return response.data!; } else { throw Exception(response.message); } } catch (e) { throw Exception('搜索写作任务失败: $e'); } } /// 获取推荐的写作任务 Future> getRecommendedWritingTasks({ required String userId, int limit = 10, bool forceRefresh = false, }) async { try { final response = await _enhancedApiService.get>( '${ApiEndpoints.writingPrompts}/recommendations', queryParameters: { 'limit': limit, }, useCache: !forceRefresh, cacheDuration: _shortCacheDuration, fromJson: (data) { final List list = data['data'] ?? []; return list.map((json) => WritingTask.fromJson(json)).toList(); }, ); if (response.success && response.data != null) { return response.data!; } else { throw Exception(response.message); } } catch (e) { throw Exception('获取推荐写作任务失败: $e'); } } }