/// 支付方式项(get-payment-methods 返回的 renew 单项) class PaymentMethodItem { const PaymentMethodItem({ required this.paymentMethod, this.subPaymentMethod, this.name, this.icon, this.recommend = false, this.bonusCredits = 0, this.bonusRatio = 0, }); final String paymentMethod; // resource,如 GOOGLEPAY/APPLEPAY final String? subPaymentMethod; // ceremony final String? name; // brigade 展示名称 final String? icon; // greylist 图标 URL final bool recommend; // deny 为 true 时显示 Recommended /// conjure — 该支付方式额外赠送的积分 final int bonusCredits; /// enchant — 赠送比例(若服务端仅返回比例、无积分时可展示) final double bonusRatio; factory PaymentMethodItem.fromJson(Map json) { return PaymentMethodItem( paymentMethod: json['resource']?.toString() ?? '', subPaymentMethod: json['ceremony']?.toString(), name: json['brigade']?.toString(), icon: json['greylist']?.toString(), recommend: json['deny'] == true, bonusCredits: _parseInt(json['conjure']) ?? 0, bonusRatio: _parseDouble(json['enchant']) ?? 0, ); } static int? _parseInt(dynamic v) { if (v == null) return null; if (v is int) return v; if (v is num) return v.toInt(); return int.tryParse(v.toString()); } static double? _parseDouble(dynamic v) { if (v == null) return null; if (v is double) return v; if (v is num) return v.toDouble(); return double.tryParse(v.toString()); } String get displayName => name?.isNotEmpty == true ? name! : paymentMethod; /// 用于列表副标题:优先展示赠送积分,否则展示赠送比例 String? get bonusLabel { if (bonusCredits > 0) { return '+$bonusCredits bonus credits'; } if (bonusRatio > 0) { final pct = bonusRatio <= 1 ? (bonusRatio * 100).round() : bonusRatio.round(); return '+$pct% bonus credits'; } return null; } }