enum HabitType { build, breakHabit } extension HabitTypeX on HabitType { String get dbValue => this == HabitType.build ? 'build' : 'break'; } enum HabitStatus { active, paused, completed, abandoned } extension HabitStatusX on HabitStatus { String get dbValue => name; } enum FrameLevel { l0, l1, l2, l3 } extension FrameLevelX on FrameLevel { String get dbValue => name.toUpperCase(); static FrameLevel? fromDb(String s) { switch (s) { case 'L0': return FrameLevel.l0; case 'L1': return FrameLevel.l1; case 'L2': return FrameLevel.l2; case 'L3': return FrameLevel.l3; } return null; } } class HabitDoseVariantModel { final String variantId; final String habitId; final String label; final String doseText; final List contextTags; final List conditionTags; final bool isMinimum; final int sortOrder; const HabitDoseVariantModel({ required this.variantId, required this.habitId, required this.label, required this.doseText, this.contextTags = const [], this.conditionTags = const [], this.isMinimum = false, this.sortOrder = 0, }); } class HabitModel { final String id; final String userId; final String? phaseId; final HabitType type; final HabitStatus status; final String title; final String? protocolId; final String? breakProtocolId; final FrameLevel frameLevel; final String frameFramedText; final String? frameOriginalText; final String? anchorWhen; final String? anchorAfterWhat; final String? anchorWhere; final String startedAt; // YYYY-MM-DD final String? endedAt; final List doseVariants; const HabitModel({ required this.id, required this.userId, this.phaseId, required this.type, required this.status, required this.title, this.protocolId, this.breakProtocolId, required this.frameLevel, required this.frameFramedText, this.frameOriginalText, this.anchorWhen, this.anchorAfterWhat, this.anchorWhere, required this.startedAt, this.endedAt, this.doseVariants = const [], }); }