class Product { final int id; final String name; final String description; final String price; final String? regularPrice; final String? salePrice; final String? imageUrl; final List images; final bool inStock; final int stockQuantity; final String? sku; final List>? categories; final double? rating; final int? ratingCount; Product({ required this.id, required this.name, required this.description, required this.price, this.regularPrice, this.salePrice, this.imageUrl, this.images = const [], this.inStock = true, this.stockQuantity = 0, this.sku, this.categories, this.rating, this.ratingCount, }); factory Product.fromJson(Map json) { final images = []; if (json['images'] != null && json['images'] is List) { for (var img in json['images']) { if (img['src'] != null) { images.add(img['src']); } } } return Product( id: json['id'] ?? 0, name: json['name'] ?? '', description: json['description'] ?? '', price: json['price'] ?? '0', regularPrice: json['regular_price'], salePrice: json['sale_price'], imageUrl: images.isNotEmpty ? images[0] : null, images: images, inStock: json['stock_status'] == 'instock', stockQuantity: json['stock_quantity'] ?? 0, sku: json['sku'], categories: json['categories'] != null ? List>.from(json['categories']) : null, rating: json['average_rating'] != null ? double.tryParse(json['average_rating'].toString()) : null, ratingCount: json['rating_count'], ); } bool get isOnSale => salePrice != null && salePrice!.isNotEmpty; double get priceValue { try { return double.parse(price); } catch (e) { return 0.0; } } Map toJson() { return { 'id': id, 'name': name, 'description': description, 'price': price, 'regular_price': regularPrice, 'sale_price': salePrice, 'image_url': imageUrl, 'images': images, 'in_stock': inStock, 'stock_quantity': stockQuantity, 'sku': sku, 'categories': categories, 'average_rating': rating, 'rating_count': ratingCount, }; } }