import 'package:drift/drift.dart'; import '../database/app_database.dart'; import '../../shared/models/account.dart' as model; class AccountLimitException implements Exception { final String message; AccountLimitException(this.message); @override String toString() => 'AccountLimitException: $message'; } class AccountRepository { final AppDatabase _db; AccountRepository(this._db); Stream> watchAll() { return (_db.select(_db.accounts) ..orderBy([(a) => OrderingTerm.asc(a.sortOrder)])) .watch() .asyncMap((rows) async { if (rows.isEmpty) { // Fallback: insert default account if none exists await _db.into(_db.accounts).insert( AccountsCompanion.insert( name: 'Main', isMain: const Value(true), currency: const Value('USD'), sortOrder: const Value(0), ), ); // Re-query after insert final newRows = await (_db.select(_db.accounts) ..orderBy([(a) => OrderingTerm.asc(a.sortOrder)])) .get(); return newRows .map((row) => model.Account( id: row.id, name: row.name, isMain: row.isMain, sortOrder: row.sortOrder, currency: row.currency, createdAt: row.createdAt, )) .toList(); } return rows .map((row) => model.Account( id: row.id, name: row.name, isMain: row.isMain, sortOrder: row.sortOrder, currency: row.currency, createdAt: row.createdAt, )) .toList(); }); } Future> getAll() async { try { var rows = await (_db.select(_db.accounts) ..orderBy([(a) => OrderingTerm.asc(a.sortOrder)])) .get(); // Fallback: insert default account if none exists if (rows.isEmpty) { try { await _db.into(_db.accounts).insert( AccountsCompanion.insert( name: 'Main', isMain: const Value(true), currency: const Value('USD'), sortOrder: const Value(0), ), ); } catch (e) { // Ignore if already exists } // Re-query after insert rows = await (_db.select(_db.accounts) ..orderBy([(a) => OrderingTerm.asc(a.sortOrder)])) .get(); } return rows .map((row) => model.Account( id: row.id, name: row.name, isMain: row.isMain, sortOrder: row.sortOrder, currency: row.currency, createdAt: row.createdAt, )) .toList(); } catch (e) { // Return empty list on error return []; } } Future getMain() async { final row = await (_db.select(_db.accounts) ..where((a) => a.isMain.equals(true))) .getSingle(); return model.Account( id: row.id, name: row.name, isMain: row.isMain, sortOrder: row.sortOrder, currency: row.currency, createdAt: row.createdAt, ); } }