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 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 json) = _$$RoutineImplFromJson; } @HiveType(typeId: 2) @freezed class Schedule with _$Schedule { const factory Schedule({ @HiveField(0) required ScheduleType type, @HiveField(1) List? 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 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 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; } } }