import 'package:flutter/material.dart'; import 'package:lunasea/database/box.dart'; import 'package:lunasea/database/models/deprecated.dart'; import 'package:lunasea/database/tables/bios.dart'; import 'package:lunasea/database/tables/dashboard.dart'; import 'package:lunasea/database/tables/lidarr.dart'; import 'package:lunasea/database/tables/lunasea.dart'; import 'package:lunasea/database/tables/nzbget.dart'; import 'package:lunasea/database/tables/overseerr.dart'; import 'package:lunasea/database/tables/radarr.dart'; import 'package:lunasea/database/tables/sabnzbd.dart'; import 'package:lunasea/database/tables/search.dart'; import 'package:lunasea/database/tables/sonarr.dart'; import 'package:lunasea/database/tables/tautulli.dart'; enum LunaTable { bios('bios', items: BIOSDatabase.values), dashboard('home', items: DashboardDatabase.values), lidarr('lidarr', items: LidarrDatabase.values), lunasea('lunasea', items: LunaSeaDatabase.values), nzbget('nzbget', items: NZBGetDatabase.values), overseerr('overseerr', items: OverseerrDatabase.values), radarr('radarr', items: RadarrDatabase.values), sabnzbd('sabnzbd', items: SABnzbdDatabase.values), search('search', items: SearchDatabase.values), sonarr('sonarr', items: SonarrDatabase.values), tautulli('tautulli', items: TautulliDatabase.values); final String key; final List items; const LunaTable( this.key, { required this.items, }); static void register() { for (final table in LunaTable.values) table.items[0].register(); registerDeprecatedAdapters(); } T? _itemFromKey(String key) { for (final item in items) { if (item.key == key) return item; } return null; } Map export() { Map results = {}; for (final item in this.items) { final value = item.export(); if (value != null) results[item.key] = value; } return results; } void import(Map? table) { if (table == null || table.isEmpty) return; for (final key in table.keys) { final db = _itemFromKey(key); db?.import(table[key]); } } } mixin LunaTableMixin on Enum { T get fallback; LunaTable get table; LunaBox get box => LunaBox.lunasea; String get key => '${table.key.toUpperCase()}_$name'; T read() => box.read(key, fallback: fallback); void update(T value) => box.update(key, value); /// Default is an empty list and does not register any Hive adapters void register() {} /// The list of items that are not imported or exported by default List get blockedFromImportExport => []; @mustCallSuper dynamic export() { if (blockedFromImportExport.contains(this)) return null; return read(); } @mustCallSuper void import(dynamic value) { if (blockedFromImportExport.contains(this) || value == null) return; return update(value as T); } ValueListenableBuilder watch({ required Widget Function(BuildContext, Widget?) builder, Key? key, Widget? child, }) { return box.watch( key: key, selectItems: [this], builder: (context, widget) => builder(context, widget), child: child, ); } }