import 'package:yumi/shared/business_logic/models/res/gift_res.dart'; import 'package:yumi/shared/data_sources/models/enum/sc_gift_type.dart'; import 'package:yumi/shared/tools/sc_cp_relation_notice_utils.dart'; bool scIsCpGiftTab(String? tabType) => tabType?.trim().toUpperCase() == SCGiftType.CP.name; bool scIsCpGift(SocialChatGiftRes? gift) => scIsCpGiftTab(gift?.giftTab); String scCpRelationTypeForGift(SocialChatGiftRes gift) { final explicit = _normalizeExplicitGiftRelationType(gift.relationType); if (explicit != null) { return explicit; } for (final value in [ gift.type, gift.giftCode, gift.giftName, gift.special, gift.standardId, ]) { final inferred = _inferCpRelationTypeFromGiftText(value); if (inferred != null) { return inferred; } } return "CP"; } String? _normalizeExplicitGiftRelationType(String? relationType) { final raw = relationType?.trim(); if (raw == null || raw.isEmpty) { return null; } final normalized = scNormalizeCpRelationType(raw); if (normalized != "CP" || _isCpRelationText(raw)) { return normalized; } return _inferCpRelationTypeFromGiftText(raw) ?? normalized; } bool _isCpRelationText(String value) { final upper = value.trim().toUpperCase(); return upper == "CP" || upper == "COUPLE"; } String? _inferCpRelationTypeFromGiftText(String? value) { final upper = value?.trim().toUpperCase(); if (upper == null || upper.isEmpty) { return null; } if (_hasRelationToken(upper, const ["SIS", "SISTER", "SISTERS"])) { return "SISTERS"; } if (_hasRelationToken(upper, const [ "BRO", "BROS", "BROTHER", "BROTHERS", "SWORN_BRO", "SWORN_BROS", "SWORN_BROTHER", "SWORN_BROTHERS", ])) { return "BROTHER"; } if (_hasRelationToken(upper, const ["CP", "COUPLE"])) { return "CP"; } return null; } bool _hasRelationToken(String upperText, List tokens) { for (final token in tokens) { final escaped = RegExp.escape(token); if (RegExp('(^|[^A-Z0-9])$escaped([^A-Z0-9]|\$)').hasMatch(upperText)) { return true; } } return false; }