content: import 'package:matrix/matrix.dart';
  
  class AccountBundles {
    String? prefix;
    List<AccountBundle>? bundles;
  
    AccountBundles({this.prefix, this.bundles});
  
    AccountBundles.fromJson(Map<String, dynamic> json)
        : prefix = json.tryGet<String>('prefix'),
          bundles = json['bundles'] is List
              ? json['bundles']
                  .map((b) {
                    try {
                      return AccountBundle.fromJson(b);
                    } catch (_) {
                      return null;
                    }
                  })
                  .whereType<AccountBundle>()
                  .toList()
              : null;
  
    Map<String, dynamic> toJson() => {
          if (prefix != null) 'prefix': prefix,
          if (bundles != null)
            'bundles': bundles!.map((v) => v.toJson()).toList(),
        };
  }
  
  class AccountBundle {
    String? name;
    int? priority;
  
    AccountBundle({this.name, this.priority});
  
    AccountBundle.fromJson(Map<String, dynamic> json)
        : name = json.tryGet<String>('name'),
          priority = json.tryGet<int>('priority');
  
    Map<String, dynamic> toJson() => <String, dynamic>{
          if (name != null) 'name': name,
          if (priority != null) 'priority': priority,
        };
  }
  
  const accountBundlesType = 'im.fluffychat.account_bundles';
  
  extension AccountBundlesExtension on Client {
    List<AccountBundle> get accountBundles {
      List<AccountBundle>? ret;
      if (accountData.containsKey(accountBundlesType)) {
        ret = AccountBundles.fromJson(accountData[accountBundlesType]!.content)
            .bundles;
      }
      ret ??= [];
      if (ret.isEmpty) {
        ret.add(
          AccountBundle(
            name: userID,
            priority: 0,
          ),
        );
      }
      return ret;
    }
  
    Future<void> setAccountBundle(String name, [int? priority]) async {
      final data =
          AccountBundles.fromJson(accountData[accountBundlesType]?.content ?? {});
      var foundBundle = false;
      final bundles = data.bundles ??= [];
      for (final bundle in bundles) {
        if (bundle.name == name) {
          bundle.priority = priority;
          foundBundle = true;
          break;
        }
      }
      if (!foundBundle) {
        bundles.add(AccountBundle(name: name, priority: priority));
      }
      await setAccountData(userID!, accountBundlesType, data.toJson());
    }
  
    Future<void> removeFromAccountBundle(String name) async {
      if (!accountData.containsKey(accountBundlesType)) {
        return; // nothing to do
      }
      final data =
          AccountBundles.fromJson(accountData[accountBundlesType]!.content);
      if (data.bundles == null) return;
      data.bundles!.removeWhere((b) => b.name == name);
      await setAccountData(userID!, accountBundlesType, data.toJson());
    }
  
    String get sendPrefix {
      final data =
          AccountBundles.fromJson(accountData[accountBundlesType]?.content ?? {});
      return data.prefix!;
    }
  }
  