import 'package:flutter_secure_storage/flutter_secure_storage.dart';

class StorageItem {
  StorageItem(this.key, this.value);

  final String key;
  final String value;
}

class StorageService {
  final _secureStorage = const FlutterSecureStorage(
    aOptions: AndroidOptions(
      encryptedSharedPreferences: true,
    ),
  );

  Future<void> writeData(StorageItem item) async {
    await _secureStorage.write(
      key: item.key,
      value: item.value,
    );
  }

  Future<String?> readData(String key) async {
    return await _secureStorage.read(key: key);
  }

  Future<List<StorageItem>> readAllSecureData() async {
    var allData = await _secureStorage.readAll();
    List<StorageItem> list =
        allData.entries.map((e) => StorageItem(e.key, e.value)).toList();
    return list;
  }

  Future<bool> containsData(String key) async {
    return await _secureStorage.containsKey(key: key);
  }

  Future<void> deleteSecureData(StorageItem item) async {
    await _secureStorage.delete(
      key: item.key,
    );
  }

  Future<void> deleteAllSecureData() async {
    await _secureStorage.deleteAll();
  }

  Future<void> setNotificationSetting(bool enabled) async {
    return await writeData(StorageItem('notifications', enabled ? '1' : '0'));
  }

  Future<bool> get notificationSetting async {
    final enabled = await readData('notifications') == '1' ? true : false;
    return enabled;
  }

  Future<int> get accountLevel async {
    int? level;
    final lev = await readData('account_level');
    if (lev != null) {
      level = int.tryParse(lev);
    }
    return level ?? 0;
  }

  Future<void> setAccountLevel(int level) async {
    return await writeData(StorageItem('account_level', '$level'));
  }

  Future<void> initAccountLevel() async {
    return await writeData(StorageItem('account_level', '0'));
  }

  Future<void> addAccountLevel() async {
    int? level;
    final l = await readData('account_level');
    if (l != null) {
      level = int.tryParse(l);
    }
    return await writeData(
        StorageItem('account_level', '${level != null ? level + 1 : 1}'));
  }
}