/* 
 * This file is part of Stack Wallet.
 * 
 * Copyright (c) 2023 Cypher Stack
 * All Rights Reserved.
 * The code is distributed under GPLv3 license, see LICENSE file for details.
 * Generated by Cypher Stack on 2023-05-26
 *
 */

import 'package:stackwallet/db/hive/db.dart';

class TransactionNotificationTracker {
  final String walletId;

  TransactionNotificationTracker({required this.walletId});

  List<String> get pendings {
    final notifiedPendingTransactions = DB.instance.get<dynamic>(
            boxName: walletId, key: "notifiedPendingTransactions") as Map? ??
        {};
    return List<String>.from(notifiedPendingTransactions.keys);
  }

  bool wasNotifiedPending(String txid) {
    final notifiedPendingTransactions = DB.instance.get<dynamic>(
            boxName: walletId, key: "notifiedPendingTransactions") as Map? ??
        {};
    return notifiedPendingTransactions[txid] as bool? ?? false;
  }

  Future<void> addNotifiedPending(String txid) async {
    final notifiedPendingTransactions = DB.instance.get<dynamic>(
            boxName: walletId, key: "notifiedPendingTransactions") as Map? ??
        {};
    notifiedPendingTransactions[txid] = true;
    await DB.instance.put<dynamic>(
        boxName: walletId,
        key: "notifiedPendingTransactions",
        value: notifiedPendingTransactions);
  }

  List<String> get confirmeds {
    final notifiedConfirmedTransactions = DB.instance.get<dynamic>(
            boxName: walletId, key: "notifiedConfirmedTransactions") as Map? ??
        {};
    return List<String>.from(notifiedConfirmedTransactions.keys);
  }

  bool wasNotifiedConfirmed(String txid) {
    final notifiedConfirmedTransactions = DB.instance.get<dynamic>(
            boxName: walletId, key: "notifiedConfirmedTransactions") as Map? ??
        {};
    return notifiedConfirmedTransactions[txid] as bool? ?? false;
  }

  Future<void> addNotifiedConfirmed(String txid) async {
    final notifiedConfirmedTransactions = DB.instance.get<dynamic>(
            boxName: walletId, key: "notifiedConfirmedTransactions") as Map? ??
        {};
    notifiedConfirmedTransactions[txid] = true;
    await DB.instance.put<dynamic>(
        boxName: walletId,
        key: "notifiedConfirmedTransactions",
        value: notifiedConfirmedTransactions);
  }

  Future<void> deleteTransaction(String txid) async {
    final notifiedPendingTransactions = DB.instance.get<dynamic>(
            boxName: walletId, key: "notifiedPendingTransactions") as Map? ??
        {};
    final notifiedConfirmedTransactions = DB.instance.get<dynamic>(
            boxName: walletId, key: "notifiedConfirmedTransactions") as Map? ??
        {};

    notifiedPendingTransactions.remove(txid);
    notifiedConfirmedTransactions.remove(txid);

    await DB.instance.put<dynamic>(
        boxName: walletId,
        key: "notifiedConfirmedTransactions",
        value: notifiedConfirmedTransactions);
    await DB.instance.put<dynamic>(
        boxName: walletId,
        key: "notifiedPendingTransactions",
        value: notifiedPendingTransactions);
  }
}