import 'package:eatvio_app/core/models/pagination_model.dart'; import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'plan_pagination_model.freezed.dart'; part 'plan_pagination_model.g.dart'; @freezed class PlanPaginationModel with _$PlanPaginationModel { const factory PlanPaginationModel({ @JsonKey(name: "data") required List data, @JsonKey(name: "links") required Links links, @JsonKey(name: "meta") required Meta meta, }) = _PlanPaginationModel; factory PlanPaginationModel.fromJson(Map json) => _$PlanPaginationModelFromJson(json); } @freezed class PlanModel with _$PlanModel { const factory PlanModel({ @JsonKey(name: "id") required int id, @JsonKey(name: "slug") required String slug, @JsonKey(name: "name") required String name, @JsonKey(name: "image") required String image, @JsonKey(name: "duration") required int duration, @JsonKey(name: "state") required String state, @JsonKey(name: "type", fromJson: planTypeFromJson) required PlanType type, @JsonKey(name: "details") required String details, @JsonKey(name: "packets_count") required int packetsCount, @JsonKey(name: "packet1_options") PacketOptions? packet1Options, @JsonKey(name: "packet2_options") PacketOptions? packet2Options, @JsonKey(name: "packet3_options") PacketOptions? packet3Options, @JsonKey(name: "author") required Author author, @JsonKey(name: "total_likes") required int totalLikes, @JsonKey(name: "total_views") required int totalViews, @JsonKey(name: "total_comments") required int totalComments, @JsonKey(name: "is_favorite") required bool isFavorite, @JsonKey(name: "min_price_of_options") required double minPriceOfOptions, @JsonKey(name: "max_price_of_options") required double maxPriceOfOptions, @Default(false) bool wasLikedByMe, }) = _PlanModel; factory PlanModel.fromJson(Map json) => _$PlanModelFromJson(json); } PlanType planTypeFromJson(dynamic json) { if (json is List) { return PlanType(fit: false, slim: false, behavior: false, wellness: false); } return PlanType.fromJson(json); } @freezed class PacketOptions with _$PacketOptions { const factory PacketOptions({ @JsonKey(name: "items") required List items, @JsonKey(name: "price") required dynamic price, @JsonKey(name: "short") required String short, @JsonKey(name: "description") required String description, }) = _PacketOptions; factory PacketOptions.fromJson(Map json) => _$PacketOptionsFromJson(json); factory PacketOptions.empty() => PacketOptions(items: [], price: 1200, short: '', description: ''); } @freezed class PlanType with _$PlanType { const PlanType._(); const factory PlanType({ @JsonKey(name: "fit") required bool? fit, @JsonKey(name: "slim") required bool? slim, @JsonKey(name: "behavior") required bool? behavior, @JsonKey(name: "wellness") required bool? wellness, }) = _PlanType; factory PlanType.fromJson(Map json) => _$PlanTypeFromJson(json); bool hasAtLeastOneType() { return (fit ?? false) || (slim ?? false) || (behavior ?? false) || (wellness ?? false); } }