import 'package:eatvio_app/features/consultations/models/consultation_model.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'diary_day_model.freezed.dart'; part 'diary_day_model.g.dart'; enum PortionState { @JsonValue('filled_diet') filledDiet, @JsonValue('eaten_from_diet') eatenFromDiet, eaten, @JsonValue('eaten_deleted') eatenDeleted, @JsonValue('eaten_edited') eatenEdited, commented, @JsonValue('reviewed_by_user') reviewedByUser, } @freezed abstract class DiaryDayWrapperModel with _$DiaryDayWrapperModel { const factory DiaryDayWrapperModel({ @JsonKey( name: "diary", ) required DiaryDayModel diary, }) = _DiaryDayWrapperModel; factory DiaryDayWrapperModel.fromJson(Map json) => _$DiaryDayWrapperModelFromJson(json); } @freezed abstract class DiaryDayModel with _$DiaryDayModel { const factory DiaryDayModel({ @JsonKey(name: "id") required int id, @JsonKey(name: "date") required String date, @JsonKey(name: "wakeup") String? wakeup, @JsonKey(name: "retire") String? retire, @JsonKey(name: "closed") required int closed, @JsonKey(name: "comment") required String comment, @JsonKey(name: "state") required TypeOfDiaryModel typeOfDiary, @JsonKey(name: "meals") required List meals, @JsonKey(name: "chosen_plan_id") required int? chosenPlanId, @JsonKey(name: "day_of_chosen_diet") required int? dayOfChosenDiet, @JsonKey(name: "chosen_diet", fromJson: _parseDiet) required DiaryDietModel? diet, }) = _DiaryDayModel; factory DiaryDayModel.fromJson(Map json) => _$DiaryDayModelFromJson(json); } @freezed abstract class DiaryFutureDietDayModel with _$DiaryFutureDietDayModel { const factory DiaryFutureDietDayModel({ @JsonKey(name: "date") required String date, @JsonKey(name: "state", fromJson: _parseDayTypeForFutureDay) required TypeOfDiaryModel typeOfDiary, @JsonKey(name: "meals") required List meals, @JsonKey(name: "chosen_diet", fromJson: _parseDiet) required DiaryDietModel? diet, @JsonKey(name: "day_of_chosen_diet") required int? dayOfChosenDiet, }) = _DiaryFutureDietDayModel; factory DiaryFutureDietDayModel.fromJson(Map json) => _$DiaryFutureDietDayModelFromJson(json); } DiaryDietModel? _parseDiet(json) { if (json == null) return null; return DiaryDietModel.fromJson(json['diet']); } @freezed abstract class DiaryDietModel with _$DiaryDietModel { const factory DiaryDietModel({ required int id, required int duration, required String name, }) = _DiaryDietModel; factory DiaryDietModel.fromJson(Map json) => _$DiaryDietModelFromJson(json); } TypeOfDiaryModel _parseDayTypeForFutureDay(json) { return TypeOfDiaryModel( hasChosenDiet: json['has_chosen_diet'] as bool, hasChosenPlan: json['has_chosen_plan'] as bool, diaryState: DiaryStateEnum.init, ); } @freezed abstract class MealModel with _$MealModel { const factory MealModel({ @JsonKey(name: "id") required int id, @JsonKey(name: "time") required String time, @JsonKey(name: "type_no") required int typeNumber, @JsonKey(name: "satiety") required int satiety, @JsonKey(name: "mood") required int mood, @JsonKey(name: "portions") required List portions, @JsonKey(name: "photos") required List photos, }) = _MealModel; factory MealModel.fromJson(Map json) => _$MealModelFromJson(json); } @freezed abstract class DiaryPhotoModel with _$DiaryPhotoModel { const factory DiaryPhotoModel({ @JsonKey(name: "id") required int id, @JsonKey(name: "original_name") required String originalName, @JsonKey(name: "path") required String path, @JsonKey(name: "size") required int size, }) = _DiaryPhotoModel; factory DiaryPhotoModel.fromJson(Map json) => _$DiaryPhotoModelFromJson(json); } @freezed abstract class PortionModel with _$PortionModel { const factory PortionModel({ @JsonKey(name: "id") required int id, @JsonKey(name: "product_nutritional_value_id") int? productNutritionalValueId, @JsonKey(name: "product_name") required String productName, @JsonKey(name: "quantity") required int quantity, @JsonKey(name: "portion") required String portion, @JsonKey(name: "from_diet") required bool fromDiet, @JsonKey(name: "state") required PortionState portionState, }) = _PortionModel; factory PortionModel.fromJson(Map json) => _$PortionModelFromJson(json); } @freezed abstract class TypeOfDiaryModel with _$TypeOfDiaryModel { const factory TypeOfDiaryModel({ @JsonKey(name: "has_chosen_diet") required bool hasChosenDiet, @JsonKey(name: "has_chosen_plan") required bool hasChosenPlan, @JsonKey(name: "last_state") required DiaryStateEnum diaryState, }) = _TypeOfDiaryModel; factory TypeOfDiaryModel.fromJson(Map json) => _$TypeOfDiaryModelFromJson(json); } @freezed abstract class ProductInMeal with _$ProductInMeal { const factory ProductInMeal({ @JsonKey(name: 'product_name') required String productName, @JsonKey(name: 'portion') required String portion, @JsonKey(name: 'quantity') required int quantity, }) = _ProductInMeal; factory ProductInMeal.fromJson(Map json) => _$ProductInMealFromJson(json); }