class LenormandReading { final String source; final String label; final String text; final int? left; final int? right; const LenormandReading({ required this.source, required this.label, required this.text, this.left, this.right, }); factory LenormandReading.fromMap(Map map) { return LenormandReading( source: map['source'] as String? ?? '', label: map['label'] as String? ?? '', text: map['text'] as String? ?? '', left: (map['left'] as num?)?.toInt(), right: (map['right'] as num?)?.toInt(), ); } } class LenormandPairLink { final int n; final String id; final String name; final String symbol; final String preview; final String text; final List readings; const LenormandPairLink({ required this.n, required this.id, required this.name, required this.symbol, required this.preview, this.text = '', required this.readings, }); String get displayText { if (text.trim().isNotEmpty) return text.trim(); if (preview.trim().isNotEmpty) return preview.trim(); return readings.map((r) => r.text).where((t) => t.trim().isNotEmpty).join('\n\n'); } factory LenormandPairLink.fromMap(Map map) { final raw = map['readings']; return LenormandPairLink( n: (map['n'] as num?)?.toInt() ?? 0, id: map['id'] as String? ?? '', name: map['name'] as String? ?? '', symbol: map['symbol'] as String? ?? '', preview: map['preview'] as String? ?? '', text: map['text'] as String? ?? '', readings: raw is List ? raw .whereType>() .map(LenormandReading.fromMap) .toList() : const [], ); } } class LenormandCardEntry { final int n; final String id; final String name; final String symbol; final String lore; final String group; final String meaning; final String shadow; final List meanings; final List pairs; const LenormandCardEntry({ required this.n, required this.id, required this.name, required this.symbol, required this.lore, required this.group, this.meaning = '', this.shadow = '', required this.meanings, required this.pairs, }); String get displayMeaning { if (meaning.trim().isNotEmpty) return meaning.trim(); return meanings.map((m) => m.text).where((t) => t.trim().isNotEmpty).join('\n\n'); } factory LenormandCardEntry.fromMap(Map map) { return LenormandCardEntry( n: (map['n'] as num?)?.toInt() ?? 0, id: map['id'] as String? ?? '', name: map['name'] as String? ?? '', symbol: map['symbol'] as String? ?? '', lore: map['lore'] as String? ?? '', group: map['group'] as String? ?? '', meaning: map['meaning'] as String? ?? '', shadow: map['shadow'] as String? ?? '', meanings: (map['meanings'] as List? ?? const []) .whereType>() .map(LenormandReading.fromMap) .toList(), pairs: (map['pairs'] as List? ?? const []) .whereType>() .map(LenormandPairLink.fromMap) .toList(), ); } } class LenormandTriad { final List cards; final List names; final String text; const LenormandTriad({ required this.cards, required this.names, required this.text, }); factory LenormandTriad.fromMap(Map map) { return LenormandTriad( cards: (map['cards'] as List? ?? const []) .map((e) => (e as num).toInt()) .toList(), names: (map['names'] as List? ?? const []).map((e) => '$e').toList(), text: map['text'] as String? ?? '', ); } } class LenormandExtra { final String source; final String title; final String text; const LenormandExtra({ required this.source, required this.title, required this.text, }); factory LenormandExtra.fromMap(Map map) { return LenormandExtra( source: map['source'] as String? ?? '', title: map['title'] as String? ?? '', text: map['text'] as String? ?? '', ); } }