import 'package:drift/drift.dart'; import '../database/app_database.dart'; import '../models/settings.dart'; abstract class SettingsService { Future getSettings(); Future saveSettings(AppSettings settings); } class DriftSettingsService implements SettingsService { final AppDatabase database; static const _settingsId = 'app_settings'; DriftSettingsService({required this.database}); AppSettings _mapRowToSettings(AppSettingsRow row) { return AppSettings( pinRequired: row.pinRequired, autoLockEnabled: row.autoLockEnabled, themeMode: AppThemeMode.values.firstWhere( (mode) => mode.name == row.themeMode, orElse: () => AppThemeMode.system, ), language: AppLanguage.values.firstWhere( (language) => language.name == row.language, orElse: () => AppLanguage.system, ), barGridRows: row.barGridRows.clamp(2, 6).toInt(), ); } @override Future getSettings() async { final query = database.select(database.appSettingsTable) ..where((s) => s.id.equals(_settingsId)); final row = await query.getSingleOrNull(); if (row == null) return AppSettings.defaults; return _mapRowToSettings(row); } @override Future saveSettings(AppSettings settings) async { await database .into(database.appSettingsTable) .insertOnConflictUpdate( AppSettingsTableCompanion.insert( id: _settingsId, pinRequired: Value(settings.pinRequired), autoLockEnabled: Value(settings.autoLockEnabled), themeMode: Value(settings.themeMode.name), language: Value(settings.language.name), barGridRows: Value(settings.barGridRows), ), ); } }