import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:hub/shared/helpers/secure_storage_helper.dart'; import 'package:hub/shared/helpers/shared_preferences_storage_helper.dart'; import 'package:hub/shared/helpers/sqlite_storage_helper.dart'; import 'package:hub/shared/utils/cache_util.dart'; import 'package:shared_preferences/shared_preferences.dart'; enum StorageType { secureStorage, sharedPreferences, dbSQLite3 } abstract class Storage { Future set(String key, dynamic value, Function(dynamic) cacheSetter); Future get(String key); Future delete(String key); Future purge(); } class StorageData { final String key; final dynamic value; final StorageType type; StorageData(this.key, this.value, this.type); } class StorageUtil { static final StorageUtil _instance = StorageUtil._internal(); factory StorageUtil() { return _instance; } StorageUtil._internal(); final SQLiteStorageHelper _sqliteStorage = SQLiteStorageHelper(); final SecureStorageHelper _secureStorage = SecureStorageHelper(); final SharedPreferencesStorageHelper _sharedPreferences = SharedPreferencesStorageHelper(); static Future set(StorageData data) async { try { var currentValue = CacheUtil().get(data.key); if (currentValue != null && currentValue == data.value) { log('Value for key ${data.key} is already set to ${data.value}, skipping update.'); return; } switch (data.type) { case StorageType.secureStorage: await SecureStorageHelper().set(data.key, data.value, (v) {}); break; case StorageType.sharedPreferences: await SharedPreferencesStorageHelper() .set(data.key, data.value, (v) {}); break; case StorageType.dbSQLite3: await SQLiteStorageHelper().set(data.key, data.value, (v) {}); break; } CacheUtil().set(data.key, data.value); } catch (e) { log('Error setting data: $e'); } } static Future get(StorageData data) async { try { var value = CacheUtil().get(data.key); if (value == null) { switch (data.type) { case StorageType.secureStorage: value = await SecureStorageHelper().get(data.key); break; case StorageType.sharedPreferences: value = await SharedPreferencesStorageHelper().get(data.key); break; case StorageType.dbSQLite3: value = await SQLiteStorageHelper().get(data.key); break; } CacheUtil().set(data.key, value); } return value; } catch (e) { log('Error getting data: $e'); return null; } } static Future delete(StorageData data) async { try { CacheUtil().delete(data.key); switch (data.type) { case StorageType.secureStorage: await SecureStorageHelper().delete(data.key); break; case StorageType.sharedPreferences: await SharedPreferencesStorageHelper().delete(data.key); break; case StorageType.dbSQLite3: await SQLiteStorageHelper().delete(data.key); break; } } catch (e) { log('Error deleting data: $e'); } } static Future purge() async { try { // await SecureStorageHelper().purge(); // await SharedPreferencesStorageHelper().purge(); await SQLiteStorageHelper().purge(); } catch (e) { log('Error purging data: $e'); } } Future ensureInitialization() async { await initSQLiteStorage(); await initSharedPreferences(); await initSecureStorage(); } Future initSharedPreferences() async { _sharedPreferences.prefs ??= await SharedPreferences.getInstance(); final bool milestone = _sharedPreferences.prefs?.getBool('milestone') ?? true; if (milestone) { isFirstRun = false; await _sharedPreferences.prefs?.setBool('milestone', false); _secureStorage.purge(); _sqliteStorage.purge(); } } Future initSecureStorage() async { log('SecureStorageHelper: Starting initialization'); try { _email = await _secureStorage.getString('ff_email'); _passwd = await _secureStorage.getString('ff_passwd'); _deviceType = await _secureStorage.getString('ff_deviceType'); _isLogged = await _secureStorage.getBool('ff_isLogged'); _tokenAPNS = await _secureStorage.getString('ff_tokenAPNS'); _accessPass = await _secureStorage.getString('accessPass'); _panicPass = await _secureStorage.getString('panicPass'); _fingerprintPass = await _secureStorage.getString('fingerprintPass'); _haveLocal = await _secureStorage.getBool('ff_have_local'); _deviceDescription = await _secureStorage.getString('deviceDescription'); } catch (e) { log('SecureStorageHelper: Error during initialization: $e'); } log('SecureStorageHelper: Initialization complete'); } Future initSQLiteStorage() async { log('SQLiteStorageHelper: Starting initialization'); try { await _sqliteStorage.database; _devUUID = await _sqliteStorage.get('devUUID') ?? ''; _userUUID = await _sqliteStorage.get('userUUID') ?? ''; _userDevUUID = await _sqliteStorage.get('userDevUUID') ?? ''; _status = await _sqliteStorage.get('status') ?? ''; _userName = await _sqliteStorage.get('userName') ?? ''; _cliUUID = await _sqliteStorage.get('cliUUID') ?? ''; _ownerUUID = await _sqliteStorage.get('ownerUUID') ?? ''; _cliName = await _sqliteStorage.get('cliName') ?? ''; _petAmountRegister = await _sqliteStorage.get('petAmountRegister') ?? ''; _whatsapp = await _sqliteStorage.getBoolean('whatsapp'); _provisional = await _sqliteStorage.getBoolean('provisional'); _pets = await _sqliteStorage.getBoolean('pets'); _local = await _sqliteStorage.getBoolean('local'); _notify = await _sqliteStorage.getBoolean('notify'); _fingerprint = await _sqliteStorage.getBoolean('fingerprint'); _access = await _sqliteStorage.getBoolean('access'); _panic = await _sqliteStorage.getBoolean('panic'); _person = await _sqliteStorage.getBoolean('person'); _requestOSnotification = await _sqliteStorage.getBoolean('requestOSnotification'); } catch (e) { log('SQLiteStorageHelper: Error during initialization: $e'); } log('SQLiteStorageHelper: Initialization complete'); } bool _isFirstRun = true; bool get isFirstRun => _isFirstRun; set isFirstRun(bool value) { _isFirstRun = value; _sharedPreferences.set('milestone', value, (v) => _isFirstRun = v); } String? _deviceDescription; String get deviceDescription => _deviceDescription ?? ''; set deviceDescription(String value) { _deviceDescription = value; _secureStorage.set( 'deviceDescription', value, (v) => _deviceDescription = v); } BuildContext? _context; BuildContext? get context => _context; set context(BuildContext? value) { _context = value; _secureStorage.set('ff_context', value.toString(), (v) => _context = value); } bool? _haveLocal; bool? get haveLocal => _haveLocal; set haveLocal(bool? value) { _haveLocal = value; _secureStorage.set( 'ff_have_local', value ?? false, (v) => _haveLocal = value); } String? _fingerprintPass; String get fingerprintPass => _fingerprintPass ?? ''; set fingerprintPass(String value) { _fingerprintPass = value; _secureStorage.set('fingerprintPass', value, (v) => _fingerprintPass = v); } String? _accessPass; String get accessPass => _accessPass ?? ''; set accessPass(String value) { _accessPass = value; _secureStorage.set('accessPass', value, (v) => _accessPass = v); } String? _panicPass; String get panicPass => _panicPass ?? ''; set panicPass(String value) { _panicPass = value; _secureStorage.set('panicPass', value, (v) => _panicPass = v); } String? _tokenAPNS; String? get tokenAPNS => _tokenAPNS; set tokenAPNS(String? value) { _tokenAPNS = value; _secureStorage.set('ff_tokenAPNS', value ?? '', (v) => _tokenAPNS = v); } String? _email; String get email => _email ?? ''; set email(String value) { _email = value; _secureStorage.set('ff_email', value, (v) => _email = v); } String? _passwd; String get passwd => _passwd ?? ''; set passwd(String value) { _passwd = value; _secureStorage.set('ff_passwd', value, (v) => _passwd = v); } String? _deviceType; String get deviceType => _deviceType ?? ''; set deviceType(String value) { _deviceType = value; _secureStorage.set('ff_deviceType', value, (v) => _deviceType = v); } bool? _isLogged; bool? get isLogged => _isLogged; set isLogged(bool? value) { _isLogged = value; _secureStorage.set('ff_isLogged', value, (v) => _isLogged = v); } String? _token; String get token => _token ?? ''; set token(String value) { _token = value; _secureStorage.set('ff_token', value, (v) => _token = v); } String _devUUID = ''; String get devUUID => _devUUID; set devUUID(String value) { _devUUID = value; _sqliteStorage.set('devUUID', value, (v) {}); } String _userUUID = ''; String get userUUID => _userUUID; set userUUID(String value) { _userUUID = value; _sqliteStorage.set('userUUID', value, (v) {}); } String _userDevUUID = ''; String get userDevUUID => _userDevUUID; set userDevUUID(String value) { _userDevUUID = value; _sqliteStorage.set('userDevUUID', value, (v) {}); } String _status = ''; String get status => _status; set status(String value) { _status = value; _sqliteStorage.set('status', value, (v) {}); } String _userName = ''; String get userName => _userName; set userName(String value) { _userName = value; _sqliteStorage.set('userName', value, (v) {}); } String _cliUUID = ''; String get cliUUID => _cliUUID; set cliUUID(String value) { _cliUUID = value; _sqliteStorage.set('cliUUID', value, (v) {}); } String _ownerUUID = ''; String get ownerUUID => _ownerUUID; set ownerUUID(String value) { _ownerUUID = value; _sqliteStorage.set('ownerUUID', value, (v) {}); } String _cliName = ''; String get cliName => _cliName; set cliName(String value) { _cliName = value; _sqliteStorage.set('cliName', value, (v) {}); } String _petAmountRegister = ''; String get petAmountRegister => _petAmountRegister; set petAmountRegister(String value) { _petAmountRegister = value; _sqliteStorage.set('petAmountRegister', value, (v) {}); } bool _whatsapp = false; bool get whatsapp => _whatsapp; set whatsapp(bool value) { _whatsapp = value; _sqliteStorage.set('whatsapp', value, (v) {}); } bool _provisional = false; bool get provisional => _provisional; set provisional(bool value) { _provisional = value; _sqliteStorage.set('provisional', value, (v) {}); } bool _pets = false; bool get pets => _pets; set pets(bool value) { _pets = value; _sqliteStorage.set('pets', value, (v) {}); } bool _local = false; bool get local => _local; set local(bool value) { _local = value; _sqliteStorage.set('local', value, (v) {}); } bool _notify = false; bool get notify => _notify; set notify(bool value) { _notify = value; _sqliteStorage.set('notify', value, (v) {}); } bool _fingerprint = false; bool get fingerprint => _fingerprint; set fingerprint(bool value) { _fingerprint = value; _sqliteStorage.set('fingerprint', value, (v) {}); } bool _access = false; bool get access => _access; set access(bool value) { _access = value; _sqliteStorage.set('access', value, (v) {}); } bool _panic = false; bool get panic => _panic; set panic(bool value) { _panic = value; _sqliteStorage.set('panic', value, (v) {}); } bool _person = false; bool get person => _person; set person(bool value) { _person = value; _sqliteStorage.set('person', value, (v) {}); } bool _requestOSnotification = false; bool get requestOSnotification => _requestOSnotification; set requestOSnotification(bool value) { _requestOSnotification = value; _sqliteStorage.set('requestOSnotification', value, (v) {}); } String get createdAt => '0000-00-00 00:00:00'; }