/// Data models for dashboard and dossier pages class DossierStats { final int imaging; final int labs; final bool genome; final int documents; final int vitals; final int medications; final int supplements; const DossierStats({ this.imaging = 0, this.labs = 0, this.genome = false, this.documents = 0, this.vitals = 0, this.medications = 0, this.supplements = 0, }); bool get hasAnyData => imaging > 0 || labs > 0 || genome || documents > 0 || vitals > 0 || medications > 0 || supplements > 0; } class DossierSummary { final String id; final String name; final String? dateOfBirth; final String? sex; final String? relation; final bool isSelf; final bool isCareReceiver; final bool canEdit; final DossierStats stats; const DossierSummary({ required this.id, required this.name, this.dateOfBirth, this.sex, this.relation, this.isSelf = false, this.isCareReceiver = false, this.canEdit = false, this.stats = const DossierStats(), }); } class DataItem { final String value; final String? summary; final String? date; final String? type; const DataItem({ required this.value, this.summary, this.date, this.type, }); } class ImagingSeries { final String id; final String? description; final String modality; final int sliceCount; const ImagingSeries({ required this.id, this.description, required this.modality, required this.sliceCount, }); } class ImagingStudy { final String id; final String description; final String date; final List series; const ImagingStudy({ required this.id, required this.description, required this.date, required this.series, }); int get seriesCount => series.length; } class GeneticVariant { final String rsid; final String? gene; final String genotype; final double? magnitude; final String? summary; final String category; const GeneticVariant({ required this.rsid, this.gene, required this.genotype, this.magnitude, this.summary, required this.category, }); String get formattedAllele { final letters = genotype.replaceAll(';', ''); return letters.split('').join(';'); } } class GeneticCategory { final String name; final int shown; final int hidden; const GeneticCategory({ required this.name, required this.shown, this.hidden = 0, }); int get total => shown + hidden; String get displayName => name.substring(0, 1).toUpperCase() + name.substring(1).replaceAll('_', ' '); } class AccessEntry { final String dossierID; final String name; final String relation; final bool canEdit; final bool isSelf; final bool isPending; const AccessEntry({ required this.dossierID, required this.name, required this.relation, this.canEdit = false, this.isSelf = false, this.isPending = false, }); } class DossierData { final DossierSummary dossier; final List studies; final List labs; final List documents; final List procedures; final List assessments; final List medications; final List symptoms; final List hospitalizations; final List therapies; final List geneticCategories; final List accessList; final int uploadCount; final String uploadSize; final bool hasGenome; final bool canEdit; final bool canManageAccess; const DossierData({ required this.dossier, this.studies = const [], this.labs = const [], this.documents = const [], this.procedures = const [], this.assessments = const [], this.medications = const [], this.symptoms = const [], this.hospitalizations = const [], this.therapies = const [], this.geneticCategories = const [], this.accessList = const [], this.uploadCount = 0, this.uploadSize = '0 KB', this.hasGenome = false, this.canEdit = false, this.canManageAccess = false, }); }