import 'package:eatvio_app/core/models/pagination_model.dart'; import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:eatvio_app/features/my_finance/models/card_model.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'plan_pagination_model.freezed.dart'; part 'plan_pagination_model.g.dart'; @freezed abstract 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 abstract 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: "description_md") required String details, @JsonKey(name: "packets_count") required int packetsCount, @JsonKey(name: "packet1_options", fromJson: parseOption) PacketOptions? packet1Options, @JsonKey(name: "packet2_options", fromJson: parseOption) PacketOptions? packet2Options, @JsonKey(name: "packet3_options", fromJson: parseOption) 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, @JsonKey(name: "was_liked_by_me") required bool wasLikedByMe, }) = _PlanModel; factory PlanModel.fromJson(Map json) => _$PlanModelFromJson(json); } PacketOptions? parseOption(json) { if (json is Map) { return PacketOptions.fromJson(json); } return null; } PlanType planTypeFromJson(dynamic json) { if (json is List) { return const PlanType(fit: false, slim: false, behavior: false, wellness: false); } return PlanType.fromJson(json); } @freezed abstract class PacketOptions with _$PacketOptions { const factory PacketOptions({ @JsonKey(name: "items", fromJson: _parseItems) required List items, @JsonKey(name: "price") required dynamic price, @JsonKey(name: "short") required String short, @JsonKey(name: "description_md") required String description, }) = _PacketOptions; factory PacketOptions.fromJson(Map json) => _$PacketOptionsFromJson(json); factory PacketOptions.empty() => PacketOptions(items: [], price: double.parse('1200'), short: '', description: ''); } List _parseItems(json) { if (json is Map) { return json.values.map((e) => e as String).toList(); } return (json as List).map((e) => e as String).toList(); } @freezed abstract class PlanType with _$PlanType { const PlanType._(); const factory PlanType({ @JsonKey(name: "fit", fromJson: parseBool) required bool? fit, @JsonKey(name: "slim", fromJson: parseBool) required bool? slim, @JsonKey(name: "behavior", fromJson: parseBool) required bool? behavior, @JsonKey(name: "wellness", fromJson: parseBool) required bool? wellness, }) = _PlanType; factory PlanType.fromJson(Map json) => _$PlanTypeFromJson(json); bool hasAtLeastOneType() { return (fit ?? false) || (slim ?? false) || (behavior ?? false) || (wellness ?? false); } }