import 'package:flutter/material.dart'; import 'package:hive_ce/hive.dart'; import 'package:retail/core/database/hive_database.dart'; import 'package:retail/features/settings/data/models/app_settings_model.dart'; import 'package:retail/features/settings/data/datasources/settings_local_datasource.dart'; import 'package:retail/features/settings/domain/entities/app_settings.dart'; /// Hive implementation of SettingsLocalDataSource class SettingsLocalDataSourceHive implements SettingsLocalDataSource { final HiveDatabase _database; static const String _settingsKey = 'app_settings'; SettingsLocalDataSourceHive(this._database); Box get _box => _database.settingsBox; /// Convert AppSettingsModel to AppSettings entity AppSettings _toEntity(AppSettingsModel model) { return AppSettings( themeMode: model.themeMode, language: model.language, currency: model.currency, taxRate: model.taxRate, storeName: model.storeName, enableSync: model.enableSync, lastSyncAt: model.lastSyncAt, ); } /// Convert AppSettings entity to AppSettingsModel AppSettingsModel _toModel(AppSettings entity) { return AppSettingsModel.fromThemeMode( themeMode: entity.themeMode, language: entity.language, currency: entity.currency, taxRate: entity.taxRate, storeName: entity.storeName, enableSync: entity.enableSync, lastSyncAt: entity.lastSyncAt, ); } @override Future getSettings() async { try { final model = _box.get(_settingsKey); if (model != null) { return _toEntity(model); } // Return default settings if not found return AppSettings.defaultSettings(); } catch (e) { throw Exception('Failed to get settings: $e'); } } @override Future saveSettings(AppSettings settings) async { try { final model = _toModel(settings); await _box.put(_settingsKey, model); } catch (e) { throw Exception('Failed to save settings: $e'); } } @override Future updateThemeMode(ThemeMode mode) async { try { final currentSettings = await getSettings(); final updated = currentSettings.copyWith(themeMode: mode); await saveSettings(updated); } catch (e) { throw Exception('Failed to update theme mode: $e'); } } @override Future updateLanguage(String language) async { try { final currentSettings = await getSettings(); final updated = currentSettings.copyWith(language: language); await saveSettings(updated); } catch (e) { throw Exception('Failed to update language: $e'); } } @override Future updateLastSyncTime(DateTime time) async { try { final currentSettings = await getSettings(); final updated = currentSettings.copyWith(lastSyncAt: time); await saveSettings(updated); } catch (e) { throw Exception('Failed to update last sync time: $e'); } } /// Additional Hive-specific methods /// Update currency Future updateCurrency(String currency) async { try { final currentSettings = await getSettings(); final updated = currentSettings.copyWith(currency: currency); await saveSettings(updated); } catch (e) { throw Exception('Failed to update currency: $e'); } } /// Update tax rate Future updateTaxRate(double taxRate) async { try { final currentSettings = await getSettings(); final updated = currentSettings.copyWith(taxRate: taxRate); await saveSettings(updated); } catch (e) { throw Exception('Failed to update tax rate: $e'); } } /// Update store name Future updateStoreName(String storeName) async { try { final currentSettings = await getSettings(); final updated = currentSettings.copyWith(storeName: storeName); await saveSettings(updated); } catch (e) { throw Exception('Failed to update store name: $e'); } } /// Toggle sync Future toggleSync(bool enable) async { try { final currentSettings = await getSettings(); final updated = currentSettings.copyWith(enableSync: enable); await saveSettings(updated); } catch (e) { throw Exception('Failed to toggle sync: $e'); } } /// Reset to default settings Future resetSettings() async { try { final defaultSettings = AppSettings.defaultSettings(); await saveSettings(defaultSettings); } catch (e) { throw Exception('Failed to reset settings: $e'); } } }