import 'package:cw_core/cake_hive.dart';
import 'package:cw_core/nano_account.dart';
import 'package:mobx/mobx.dart';
import 'package:hive/hive.dart';

part 'nano_account_list.g.dart';

class NanoAccountList = NanoAccountListBase with _$NanoAccountList;

abstract class NanoAccountListBase with Store {
  NanoAccountListBase(this.address)
      : accounts = ObservableList<NanoAccount>(),
        _isRefreshing = false,
        _isUpdating = false {
    refresh();
  }

  @observable
  ObservableList<NanoAccount> accounts;
  bool _isRefreshing;
  bool _isUpdating;

  String address;

  Future<void> update(String? address) async {
    if (_isUpdating) {
      return;
    }

    try {
      _isUpdating = true;

      final accounts = await getAll(address: address ?? this.address);

      if (accounts.isNotEmpty) {
        this.accounts.clear();
        this.accounts.addAll(accounts);
      }

      _isUpdating = false;
    } catch (e) {
      _isUpdating = false;
      rethrow;
    }
  }

  Future<List<NanoAccount>> getAll({String? address}) async {
    final box = await CakeHive.openBox<NanoAccount>(address ?? this.address);

    // get all accounts in box:
    return box.values.toList();
  }

  Future<void> addAccount({required String label}) async {
    final box = await CakeHive.openBox<NanoAccount>(address);
    final account = NanoAccount(id: box.length, label: label, balance: "0.00", isSelected: false);
    await box.add(account);
    await account.save();
  }

  Future<void> setLabelAccount({required int accountIndex, required String label}) async {
    final box = await CakeHive.openBox<NanoAccount>(address);
    final account = box.getAt(accountIndex);
    account!.label = label;
    await account.save();
  }

  void refresh() {}
}