class ApiResultModel { const ApiResultModel({ required this.identitas, required this.zScore, required this.kategori, required this.statusGabungan, required this.rekomendasi, this.measurement, }); final IdentitasModel identitas; final ZScoreModel zScore; final KategoriModel kategori; final String statusGabungan; final List rekomendasi; final AnalysisMeasurementModel? measurement; factory ApiResultModel.fromJson(Map json) { return ApiResultModel( identitas: IdentitasModel.fromJson( json['identitas'] as Map? ?? const {}, ), zScore: ZScoreModel.fromJson( json['zscore'] as Map? ?? const {}, ), kategori: KategoriModel.fromJson( json['kategori'] as Map? ?? const {}, ), statusGabungan: json['status_gabungan'] as String? ?? '-', rekomendasi: (json['rekomendasi'] as List? ?? const []) .whereType>() .map(RekomendasiModel.fromJson) .toList(), measurement: json['measurement'] is Map ? AnalysisMeasurementModel.fromJson( json['measurement'] as Map, ) : null, ); } } class AnalysisMeasurementModel { const AnalysisMeasurementModel({ required this.id, required this.childId, required this.childName, required this.tanggalUkur, required this.caraUkur, this.isAnomaly = false, this.dataStatus = 'normal', this.validationStatus = 'valid', this.validationNote = '', this.monitoringStatus = 'normal', this.isConfirmedByParent = false, }); final int id; final int childId; final String childName; final String tanggalUkur; final String? caraUkur; final bool isAnomaly; final String dataStatus; final String validationStatus; final String validationNote; final String monitoringStatus; final bool isConfirmedByParent; factory AnalysisMeasurementModel.fromJson(Map json) { return AnalysisMeasurementModel( id: (json['id'] as num?)?.toInt() ?? 0, childId: (json['child_id'] as num?)?.toInt() ?? 0, childName: json['child_name'] as String? ?? '-', tanggalUkur: json['tanggal_ukur'] as String? ?? '-', caraUkur: json['cara_ukur'] as String?, isAnomaly: json['is_anomaly'] == true, dataStatus: json['data_status'] as String? ?? 'normal', validationStatus: json['validation_status'] as String? ?? 'valid', validationNote: json['validation_note'] as String? ?? '', monitoringStatus: json['monitoring_status'] as String? ?? 'normal', isConfirmedByParent: json['is_confirmed_by_parent'] == true, ); } } class IdentitasModel { const IdentitasModel({ required this.umurBulan, required this.jenisKelamin, required this.caraUkur, required this.standarBbtb, this.umurHari, }); final double umurBulan; final String jenisKelamin; final String caraUkur; final String standarBbtb; final int? umurHari; factory IdentitasModel.fromJson(Map json) { double parseNum(dynamic v) { if (v is num) return v.toDouble(); return double.nan; } return IdentitasModel( umurBulan: parseNum(json['umur_bulan']), jenisKelamin: json['jenis_kelamin'] as String? ?? '-', caraUkur: json['cara_ukur'] as String? ?? '-', standarBbtb: json['standar_bbtb'] as String? ?? 'BB/TB', umurHari: (json['umur_hari'] as num?)?.toInt(), ); } } class ZScoreModel { const ZScoreModel({required this.bbu, required this.tbu, required this.bbtb}); final double bbu; final double tbu; final double bbtb; factory ZScoreModel.fromJson(Map json) { double parseNum(dynamic v) { if (v is num) return v.toDouble(); return double.nan; } return ZScoreModel( bbu: parseNum(json['bbu']), tbu: parseNum(json['tbu']), bbtb: parseNum(json['bbtb']), ); } } class KategoriModel { const KategoriModel({ required this.bbu, required this.tbu, required this.bbtb, }); final String bbu; final String tbu; final String bbtb; factory KategoriModel.fromJson(Map json) { return KategoriModel( bbu: json['bbu'] as String? ?? '-', tbu: json['tbu'] as String? ?? '-', bbtb: json['bbtb'] as String? ?? '-', ); } } class RekomendasiModel { const RekomendasiModel({ required this.menu, required this.kalori, required this.protein, required this.lemak, required this.karbohidrat, required this.alasan, this.thumbnail, }); final String menu; final int kalori; final int protein; final int lemak; final int karbohidrat; final String alasan; final String? thumbnail; factory RekomendasiModel.fromJson(Map json) { int parseInt(dynamic v) { if (v is int) return v; if (v is num) return v.toInt(); return 0; } return RekomendasiModel( menu: json['menu'] as String? ?? '-', kalori: parseInt(json['kalori']), protein: parseInt(json['protein']), lemak: parseInt(json['lemak']), karbohidrat: parseInt(json['karbohidrat']), alasan: json['alasan'] as String? ?? '-', thumbnail: json['thumbnail'] as String? ?? json['image'] as String? ?? json['image_url'] as String?, ); } }