import 'package:drift/drift.dart'; import 'package:trainhub_flutter/core/utils/id_generator.dart'; import 'package:trainhub_flutter/data/database/app_database.dart'; import 'package:trainhub_flutter/data/database/daos/chat_dao.dart'; import 'package:trainhub_flutter/data/mappers/chat_mapper.dart'; import 'package:trainhub_flutter/domain/entities/chat_session.dart'; import 'package:trainhub_flutter/domain/entities/chat_message.dart'; import 'package:trainhub_flutter/domain/repositories/chat_repository.dart'; class ChatRepositoryImpl implements ChatRepository { final ChatDao _dao; ChatRepositoryImpl(this._dao); @override Future> getAllSessions() async { final rows = await _dao.getAllSessions(); return rows.map(ChatMapper.sessionToEntity).toList(); } @override Future getSession(String id) async { final row = await _dao.getSession(id); return row == null ? null : ChatMapper.sessionToEntity(row); } @override Future createSession() async { final String id = IdGenerator.generate(); final String now = DateTime.now().toIso8601String(); await _dao.insertSession( ChatSessionsCompanion.insert( id: id, title: const Value('New Chat'), createdAt: now, updatedAt: now, ), ); final row = await _dao.getSession(id); return ChatMapper.sessionToEntity(row!); } @override Future deleteSession(String id) async { await _dao.deleteSession(id); } @override Future> getMessages(String sessionId) async { final rows = await _dao.getMessages(sessionId); return rows.map(ChatMapper.messageToEntity).toList(); } @override Future addMessage({ required String sessionId, required String role, required String content, }) async { final String id = IdGenerator.generate(); final String now = DateTime.now().toIso8601String(); await _dao.insertMessage( ChatMessagesCompanion.insert( id: id, sessionId: sessionId, role: role, content: content, createdAt: now, ), ); return ChatMessageEntity( id: id, sessionId: sessionId, role: role, content: content, createdAt: now, ); } @override Future updateSessionTitle(String sessionId, String title) async { await _dao.updateSessionTitle(sessionId, title); } }