import 'dart:convert'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart' show rootBundle; import '../models/lenormand_pairs.dart'; class OghamFedaRepository { static final OghamFedaRepository _instance = OghamFedaRepository._internal(); factory OghamFedaRepository() => _instance; OghamFedaRepository._internal(); final Map _byN = {}; final Map _byId = {}; bool _loaded = false; LenormandCardEntry? byNumber(int n) => _byN[n]; LenormandCardEntry? byCanonId(String id) => _byId[id]; List get allFedas => _byN.values.toList()..sort((a, b) => a.n.compareTo(b.n)); Future init() async { if (_loaded && _byN.isNotEmpty) return; Map? decoded; final cwd = Directory.current.path; for (final path in { 'assets/data/ogham_feda.json', '../assets/data/ogham_feda.json', '$cwd/assets/data/ogham_feda.json', }) { try { final file = File(path); if (file.existsSync()) { decoded = json.decode(file.readAsStringSync()) as Map; break; } } catch (e) { debugPrint('ogham_feda.json skip $path: $e'); } } if (decoded == null) { try { decoded = json.decode(await rootBundle.loadString('assets/data/ogham_feda.json')) as Map; } catch (e) { debugPrint('Could not load ogham_feda.json: $e'); } } if (decoded == null) { _loaded = true; return; } _byN.clear(); _byId.clear(); for (final raw in (decoded['cards'] as List? ?? const [])) { if (raw is! Map) continue; final card = LenormandCardEntry.fromMap(raw); _byN[card.n] = card; _byId[card.id] = card; } _loaded = true; } }