LifeFlow/android/lib/models/routine.dart

163 lines
3.9 KiB
Dart

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart';
part 'routine.freezed.dart';
part 'routine.g.dart';
@HiveType(typeId: 0)
enum RoutineCategory {
@HiveField(0)
medication,
@HiveField(1)
vitamin,
@HiveField(2)
appointment,
@HiveField(3)
sleep,
@HiveField(4)
food,
@HiveField(5)
hydration,
@HiveField(6)
exercise,
@HiveField(7)
hygiene,
@HiveField(8)
selfCare,
@HiveField(9)
custom,
}
@HiveType(typeId: 1)
@freezed
class Routine with _$Routine {
const factory Routine({
@HiveField(0) required String id,
@HiveField(1) required String name,
@HiveField(2) String? description,
@HiveField(3) required RoutineCategory category,
@HiveField(4) required Schedule schedule,
@HiveField(5) @Default([]) List<Reminder> reminders,
@HiveField(6) @Default(10) int points,
@HiveField(7) String? icon,
@HiveField(8) String? color,
@HiveField(9) @Default(true) bool isActive,
@HiveField(10) required DateTime createdAt,
@HiveField(11) DateTime? updatedAt,
}) = _Routine;
factory Routine.fromJson(Map<String, dynamic> json) =
_$$RoutineImplFromJson;
}
@HiveType(typeId: 2)
@freezed
class Schedule with _$Schedule {
const factory Schedule({
@HiveField(0) required ScheduleType type,
@HiveField(1) List<int>? daysOfWeek, // 0 = Monday, 6 = Sunday
@HiveField(2) DateTime? specificDate,
@HiveField(3) required String time, // "HH:mm" format
@HiveField(4) int? intervalDays, // For every X days
}) = _Schedule;
factory Schedule.fromJson(Map<String, dynamic> json) =
_$$ScheduleImplFromJson;
}
@HiveType(typeId: 3)
enum ScheduleType {
@HiveField(0)
daily,
@HiveField(1)
weekly,
@HiveField(2)
specificDate,
@HiveField(3)
interval,
}
@HiveType(typeId: 4)
@freezed
class Reminder with _$Reminder {
const factory Reminder({
@HiveField(0) required String id,
@HiveField(1) required int minutesBefore,
@HiveField(2) @Default(true) bool isEnabled,
}) = _Reminder;
factory Reminder.fromJson(Map<String, dynamic> json) =
_$$ReminderImplFromJson;
}
// Extension for category metadata
extension RoutineCategoryExtension on RoutineCategory {
String get displayName {
switch (this) {
case RoutineCategory.medication:
return 'Medication';
case RoutineCategory.vitamin:
return 'Vitamins';
case RoutineCategory.appointment:
return 'Appointments';
case RoutineCategory.sleep:
return 'Sleep';
case RoutineCategory.food:
return 'Food & Nutrition';
case RoutineCategory.hydration:
return 'Hydration';
case RoutineCategory.exercise:
return 'Exercise';
case RoutineCategory.hygiene:
return 'Hygiene';
case RoutineCategory.selfCare:
return 'Self Care';
case RoutineCategory.custom:
return 'Custom';
}
}
String get icon {
switch (this) {
case RoutineCategory.medication:
return '💊';
case RoutineCategory.vitamin:
return '🍊';
case RoutineCategory.appointment:
return '📅';
case RoutineCategory.sleep:
return '😴';
case RoutineCategory.food:
return '🍎';
case RoutineCategory.hydration:
return '💧';
case RoutineCategory.exercise:
return '🏃';
case RoutineCategory.hygiene:
return '🧼';
case RoutineCategory.selfCare:
return '🧘';
case RoutineCategory.custom:
return '';
}
}
int get defaultPoints {
switch (this) {
case RoutineCategory.medication:
case RoutineCategory.vitamin:
return 20;
case RoutineCategory.appointment:
return 15;
case RoutineCategory.exercise:
return 25;
case RoutineCategory.sleep:
return 30;
case RoutineCategory.hydration:
return 10;
default:
return 15;
}
}
}