import 'dart:async'; import 'dart:convert'; import 'package:hive/hive.dart'; import 'package:logger/logger.dart'; import '../cekirdek/hata.dart'; import '../cekirdek/sabitler.dart'; import '../modeller/karakter.dart'; /// Karakter Hive deposu — JSON string olarak saklanır. class KarakterDeposu { KarakterDeposu._(); static final KarakterDeposu ornek = KarakterDeposu._(); final Logger _log = Logger(printer: SimplePrinter(colors: true)); Box _box() { if (!Hive.isBoxOpen(FikoSabitler.boxKarakterler)) { throw FikoHata.dosya( 'Karakterler kutusu açık değil — main.dart Hive init eksik.', ); } return Hive.box(FikoSabitler.boxKarakterler); } Future> hepsiniGetir() async { final box = _box(); final liste = []; for (final v in box.values) { try { final ham = v is String ? jsonDecode(v) : v; if (ham is Map) { liste.add(Karakter.fromJson(Map.from(ham))); } } catch (e) { _log.w('Karakter okunamadı: $e'); } } liste.sort((a, b) => b.guncelleme.compareTo(a.guncelleme)); return liste; } Future getir(String id) async { final box = _box(); final v = box.get(id); if (v == null) return null; try { final ham = v is String ? jsonDecode(v) : v; return Karakter.fromJson(Map.from(ham as Map)); } catch (e) { throw FikoHata.dosya('Karakter parse hatası: $e'); } } Future kaydet(Karakter k) async { final box = _box(); final guncel = k.copyWith(guncelleme: DateTime.now()); await box.put(guncel.id, jsonEncode(guncel.toJson())); } Future sil(String id) async { await _box().delete(id); } /// Hive watch — ekleme/silme/güncellemede tetiklenir. Stream> izle() { final box = _box(); final ctrl = StreamController>(sync: false); Future yayinla() async { try { ctrl.add(await hepsiniGetir()); } catch (e) { ctrl.addError(e); } } yayinla(); final abone = box.watch().listen((_) => yayinla()); ctrl.onCancel = () async { await abone.cancel(); }; return ctrl.stream; } }