import 'package:fixnum/fixnum.dart';
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> setAccessToken(String accessToken) async {
    return await writeData(StorageItem('access_token', accessToken));
  }

  Future<String?> get accessToken async {
    return await readData('access_token');
  }

  Future<void> setAccountId(Int64 accountId) async {
    return await writeData(StorageItem('account_id', '$accountId'));
  }

  Future<Int64> get accountId async {
    Int64? accountId;
    final id = await readData('account_id');
    if (id != null) {
      final i = Int64.tryParseInt(id);
      if (i != null) {
        accountId = i;
      }
    }
    return accountId ?? Int64(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}'));
  }
}