enum ProductCode { newUserPack, basicPack, popularPack, premiumPack } enum PackageType { starter, regular } class PackageInfo { const PackageInfo({ required this.productCode, required this.appStoreProductId, required this.type, required this.price, required this.credits, required this.isStarter, required this.starterEligible, required this.sortOrder, }); final ProductCode productCode; final String appStoreProductId; final PackageType type; final double price; final int credits; final bool isStarter; final bool starterEligible; final int sortOrder; factory PackageInfo.fromJson(Map json) { return PackageInfo( productCode: _parseProductCode(json['productCode'] as String), appStoreProductId: json['appStoreProductId'] as String, type: json['type'] == 'starter' ? PackageType.starter : PackageType.regular, price: (json['price'] as num).toDouble(), credits: json['credits'] as int, isStarter: json['isStarter'] as bool, starterEligible: json['starterEligible'] as bool, sortOrder: json['sortOrder'] as int, ); } static ProductCode _parseProductCode(String code) { return switch (code) { 'new_user_pack' => ProductCode.newUserPack, 'basic_pack' => ProductCode.basicPack, 'popular_pack' => ProductCode.popularPack, 'premium_pack' => ProductCode.premiumPack, _ => throw ArgumentError('Unknown product code: $code'), }; } String get priceDisplay => '\$${price.toStringAsFixed(2)}'; } class PackagesResult { const PackagesResult({ required this.region, required this.currency, required this.packages, }); final String region; final String currency; final List packages; factory PackagesResult.fromJson(Map json) { return PackagesResult( region: json['region'] as String, currency: json['currency'] as String, packages: (json['packages'] as List) .map((e) => PackageInfo.fromJson(e as Map)) .toList(), ); } }