class SCVipResourceRes { SCVipResourceRes({ String? resourceId, String? name, String? url, String? sourceUrl, String? resourceUrl, String? cover, String? coverUrl, }) { _resourceId = resourceId; _name = name; _url = url; _sourceUrl = sourceUrl; _resourceUrl = resourceUrl; _cover = cover; _coverUrl = coverUrl; } SCVipResourceRes.fromJson(dynamic json) { final map = _asMap(json); if (map == null) return; _resourceId = _stringValue(map['resourceId']); _name = _stringValue(map['name']); _url = _stringValue(map['url']); _sourceUrl = _stringValue(map['sourceUrl']); _resourceUrl = _stringValue(map['resourceUrl']); _cover = _stringValue(map['cover']); _coverUrl = _stringValue(map['coverUrl']); } String? _resourceId; String? _name; String? _url; String? _sourceUrl; String? _resourceUrl; String? _cover; String? _coverUrl; String? get resourceId => _resourceId; String? get name => _name; String? get url => _url; String? get sourceUrl => _sourceUrl; String? get resourceUrl => _resourceUrl; String? get cover => _cover; String? get coverUrl => _coverUrl; String? get previewUrl { final cover = _firstNonBlank([_coverUrl, _cover]); if (cover != null) return cover; final staticUrl = _firstNonBlank( [_url, _resourceUrl, _sourceUrl].where((value) { final text = value?.trim(); return text != null && text.isNotEmpty && !_isSvgaUrl(text); }), ); if (staticUrl != null) return staticUrl; return _firstNonBlank([_url, _resourceUrl, _sourceUrl]); } String? get sourceResourceUrl => _firstNonBlank([_sourceUrl, _resourceUrl, _url]); bool get hasIdentity { final id = _resourceId?.trim(); return id != null && id.isNotEmpty && id != '0'; } bool get hasAnyUrl => _firstNonBlank([_url, _sourceUrl, _resourceUrl, _cover, _coverUrl]) != null; bool get hasPreviewUrl => previewUrl != null; bool get hasSourceUrl => sourceResourceUrl != null; bool get hasContent => hasAnyUrl || hasIdentity || (_name?.trim().isNotEmpty ?? false); Map toJson() { final map = {}; map['resourceId'] = _resourceId; map['name'] = _name; map['url'] = _url; map['sourceUrl'] = _sourceUrl; map['resourceUrl'] = _resourceUrl; map['cover'] = _cover; map['coverUrl'] = _coverUrl; return map; } } class SCVipStatusRes { SCVipStatusRes({ String? userId, String? sysOrigin, bool? active, String? status, num? level, String? levelCode, String? displayName, String? startAt, String? expireAt, SCVipResourceRes? badge, SCVipResourceRes? longBadge, SCVipResourceRes? shortBadge, SCVipResourceRes? avatarFrame, SCVipResourceRes? entryEffect, SCVipResourceRes? chatBubble, SCVipResourceRes? floatPicture, SCVipResourceRes? backgroundCard, SCVipResourceRes? effectImage, }) { _userId = userId; _sysOrigin = sysOrigin; _active = active; _status = status; _level = level; _levelCode = levelCode; _displayName = displayName; _startAt = startAt; _expireAt = expireAt; _badge = badge; _longBadge = longBadge; _shortBadge = shortBadge; _avatarFrame = avatarFrame; _entryEffect = entryEffect; _chatBubble = chatBubble; _floatPicture = floatPicture; _backgroundCard = backgroundCard; _effectImage = effectImage; } SCVipStatusRes.fromJson(dynamic json) { final map = _asMap(json); if (map == null) return; _userId = _stringValue(map['userId']); _sysOrigin = _stringValue(map['sysOrigin']); _active = _boolValue(map['active']); _status = _stringValue(map['status']); _level = _numValue(map['level']); _levelCode = _stringValue(map['levelCode']); _displayName = _stringValue(map['displayName']); _startAt = _stringValue(map['startAt']); _expireAt = _stringValue(map['expireAt']); _badge = _resourceValue(map['badge']); _longBadge = _resourceValue(map['longBadge']) ?? _badge; _shortBadge = _resourceValue(map['shortBadge']); _avatarFrame = _resourceValue(map['avatarFrame']); _entryEffect = _resourceValue(map['entryEffect']); _chatBubble = _resourceValue(map['chatBubble']); _floatPicture = _resourceValue(map['floatPicture']); _backgroundCard = _resourceValue(map['backgroundCard']); _effectImage = _resourceValue(map['effectImage']); } String? _userId; String? _sysOrigin; bool? _active; String? _status; num? _level; String? _levelCode; String? _displayName; String? _startAt; String? _expireAt; SCVipResourceRes? _badge; SCVipResourceRes? _longBadge; SCVipResourceRes? _shortBadge; SCVipResourceRes? _avatarFrame; SCVipResourceRes? _entryEffect; SCVipResourceRes? _chatBubble; SCVipResourceRes? _floatPicture; SCVipResourceRes? _backgroundCard; SCVipResourceRes? _effectImage; String? get userId => _userId; String? get sysOrigin => _sysOrigin; bool? get active => _active; String? get status => _status; num? get level => _level; String? get levelCode => _levelCode; String? get displayName => _displayName; String? get startAt => _startAt; String? get expireAt => _expireAt; SCVipResourceRes? get badge => longBadge; SCVipResourceRes? get longBadge => _longBadge ?? _badge; SCVipResourceRes? get shortBadge => _shortBadge; SCVipResourceRes? get avatarFrame => _avatarFrame; SCVipResourceRes? get entryEffect => _entryEffect; SCVipResourceRes? get chatBubble => _chatBubble; SCVipResourceRes? get floatPicture => _floatPicture; SCVipResourceRes? get backgroundCard => _backgroundCard; SCVipResourceRes? get effectImage => _effectImage; bool get isActive => _active == true && (_level ?? 0) > 0; int get levelInt => (_level ?? 0).toInt(); String get displayNameText { final name = _displayName?.trim(); if (name != null && name.isNotEmpty) return name; final code = _levelCode?.trim(); if (code != null && code.isNotEmpty) return code; return levelInt > 0 ? 'VIP $levelInt' : 'VIP'; } Map toJson() { final map = {}; map['userId'] = _userId; map['sysOrigin'] = _sysOrigin; map['active'] = _active; map['status'] = _status; map['level'] = _level; map['levelCode'] = _levelCode; map['displayName'] = _displayName; map['startAt'] = _startAt; map['expireAt'] = _expireAt; if (badge != null) map['badge'] = badge?.toJson(); if (longBadge != null) map['longBadge'] = longBadge?.toJson(); if (_shortBadge != null) map['shortBadge'] = _shortBadge?.toJson(); if (_avatarFrame != null) map['avatarFrame'] = _avatarFrame?.toJson(); if (_entryEffect != null) map['entryEffect'] = _entryEffect?.toJson(); if (_chatBubble != null) map['chatBubble'] = _chatBubble?.toJson(); if (_floatPicture != null) map['floatPicture'] = _floatPicture?.toJson(); if (_backgroundCard != null) { map['backgroundCard'] = _backgroundCard?.toJson(); } if (_effectImage != null) map['effectImage'] = _effectImage?.toJson(); return map; } } class SCVipLevelConfigRes { SCVipLevelConfigRes({ num? level, String? levelCode, String? displayName, bool? enabled, num? durationDays, num? priceGold, SCVipResourceRes? badge, SCVipResourceRes? longBadge, SCVipResourceRes? shortBadge, SCVipResourceRes? avatarFrame, SCVipResourceRes? entryEffect, SCVipResourceRes? chatBubble, SCVipResourceRes? floatPicture, SCVipResourceRes? backgroundCard, SCVipResourceRes? effectImage, bool? canPurchase, num? payableGold, }) { _level = level; _levelCode = levelCode; _displayName = displayName; _enabled = enabled; _durationDays = durationDays; _priceGold = priceGold; _badge = badge; _longBadge = longBadge; _shortBadge = shortBadge; _avatarFrame = avatarFrame; _entryEffect = entryEffect; _chatBubble = chatBubble; _floatPicture = floatPicture; _backgroundCard = backgroundCard; _effectImage = effectImage; _canPurchase = canPurchase; _payableGold = payableGold; } SCVipLevelConfigRes.fromJson(dynamic json) { final map = _asMap(json); if (map == null) return; _level = _numValue(map['level']); _levelCode = _stringValue(map['levelCode']); _displayName = _stringValue(map['displayName']); _enabled = _boolValue(map['enabled']); _durationDays = _numValue(map['durationDays']); _priceGold = _numValue(map['priceGold']); _badge = _resourceValue(map['badge']); _longBadge = _resourceValue(map['longBadge']) ?? _badge; _shortBadge = _resourceValue(map['shortBadge']); _avatarFrame = _resourceValue(map['avatarFrame']); _entryEffect = _resourceValue(map['entryEffect']); _chatBubble = _resourceValue(map['chatBubble']); _floatPicture = _resourceValue(map['floatPicture']); _backgroundCard = _resourceValue(map['backgroundCard']); _effectImage = _resourceValue(map['effectImage']); _canPurchase = _boolValue(map['canPurchase']); _payableGold = _numValue(map['payableGold']); } num? _level; String? _levelCode; String? _displayName; bool? _enabled; num? _durationDays; num? _priceGold; SCVipResourceRes? _badge; SCVipResourceRes? _longBadge; SCVipResourceRes? _shortBadge; SCVipResourceRes? _avatarFrame; SCVipResourceRes? _entryEffect; SCVipResourceRes? _chatBubble; SCVipResourceRes? _floatPicture; SCVipResourceRes? _backgroundCard; SCVipResourceRes? _effectImage; bool? _canPurchase; num? _payableGold; num? get level => _level; String? get levelCode => _levelCode; String? get displayName => _displayName; bool? get enabled => _enabled; num? get durationDays => _durationDays; num? get priceGold => _priceGold; SCVipResourceRes? get badge => longBadge; SCVipResourceRes? get longBadge => _longBadge ?? _badge; SCVipResourceRes? get shortBadge => _shortBadge; SCVipResourceRes? get avatarFrame => _avatarFrame; SCVipResourceRes? get entryEffect => _entryEffect; SCVipResourceRes? get chatBubble => _chatBubble; SCVipResourceRes? get floatPicture => _floatPicture; SCVipResourceRes? get backgroundCard => _backgroundCard; SCVipResourceRes? get effectImage => _effectImage; bool? get canPurchase => _canPurchase; num? get payableGold => _payableGold; int get levelInt => (_level ?? 0).toInt(); String get displayNameText { final name = _displayName?.trim(); if (name != null && name.isNotEmpty) return name; final code = _levelCode?.trim(); if (code != null && code.isNotEmpty) return code; return levelInt > 0 ? 'VIP$levelInt' : 'VIP'; } Map toJson() { final map = {}; map['level'] = _level; map['levelCode'] = _levelCode; map['displayName'] = _displayName; map['enabled'] = _enabled; map['durationDays'] = _durationDays; map['priceGold'] = _priceGold; if (badge != null) map['badge'] = badge?.toJson(); if (longBadge != null) map['longBadge'] = longBadge?.toJson(); if (_shortBadge != null) map['shortBadge'] = _shortBadge?.toJson(); if (_avatarFrame != null) map['avatarFrame'] = _avatarFrame?.toJson(); if (_entryEffect != null) map['entryEffect'] = _entryEffect?.toJson(); if (_chatBubble != null) map['chatBubble'] = _chatBubble?.toJson(); if (_floatPicture != null) map['floatPicture'] = _floatPicture?.toJson(); if (_backgroundCard != null) { map['backgroundCard'] = _backgroundCard?.toJson(); } if (_effectImage != null) map['effectImage'] = _effectImage?.toJson(); map['canPurchase'] = _canPurchase; map['payableGold'] = _payableGold; return map; } } class SCVipHomeRes { SCVipHomeRes({ String? userId, String? sysOrigin, bool? configured, SCVipStatusRes? state, List? levels, }) { _userId = userId; _sysOrigin = sysOrigin; _configured = configured; _state = state; _levels = levels; } SCVipHomeRes.fromJson(dynamic json) { final map = _asMap(json); if (map == null) return; _userId = _stringValue(map['userId']); _sysOrigin = _stringValue(map['sysOrigin']); _configured = _boolValue(map['configured']); final stateMap = _asMap(map['state']); _state = stateMap != null && stateMap.isNotEmpty ? SCVipStatusRes.fromJson(stateMap) : null; _levels = _asList( map['levels'], ).map((dynamic item) => SCVipLevelConfigRes.fromJson(item)).toList(); } String? _userId; String? _sysOrigin; bool? _configured; SCVipStatusRes? _state; List? _levels; String? get userId => _userId; String? get sysOrigin => _sysOrigin; bool? get configured => _configured; SCVipStatusRes? get state => _state; List get levels => _levels ?? []; Map toJson() { final map = {}; map['userId'] = _userId; map['sysOrigin'] = _sysOrigin; map['configured'] = _configured; if (_state != null) map['state'] = _state?.toJson(); map['levels'] = levels.map((item) => item.toJson()).toList(); return map; } } class SCVipPreviewRes { SCVipPreviewRes({ String? userId, String? sysOrigin, String? orderType, num? currentLevel, num? targetLevel, num? durationDays, num? originalPriceGold, num? payableGold, String? startAt, String? expireAt, SCVipLevelConfigRes? targetConfig, }) { _userId = userId; _sysOrigin = sysOrigin; _orderType = orderType; _currentLevel = currentLevel; _targetLevel = targetLevel; _durationDays = durationDays; _originalPriceGold = originalPriceGold; _payableGold = payableGold; _startAt = startAt; _expireAt = expireAt; _targetConfig = targetConfig; } SCVipPreviewRes.fromJson(dynamic json) { final map = _asMap(json); if (map == null) return; _userId = _stringValue(map['userId']); _sysOrigin = _stringValue(map['sysOrigin']); _orderType = _stringValue(map['orderType']); _currentLevel = _numValue(map['currentLevel']); _targetLevel = _numValue(map['targetLevel']); _durationDays = _numValue(map['durationDays']); _originalPriceGold = _numValue(map['originalPriceGold']); _payableGold = _numValue(map['payableGold']); _startAt = _stringValue(map['startAt']); _expireAt = _stringValue(map['expireAt']); final targetConfigMap = _asMap(map['targetConfig']); _targetConfig = targetConfigMap != null && targetConfigMap.isNotEmpty ? SCVipLevelConfigRes.fromJson(targetConfigMap) : null; } String? _userId; String? _sysOrigin; String? _orderType; num? _currentLevel; num? _targetLevel; num? _durationDays; num? _originalPriceGold; num? _payableGold; String? _startAt; String? _expireAt; SCVipLevelConfigRes? _targetConfig; String? get userId => _userId; String? get sysOrigin => _sysOrigin; String? get orderType => _orderType; num? get currentLevel => _currentLevel; num? get targetLevel => _targetLevel; num? get durationDays => _durationDays; num? get originalPriceGold => _originalPriceGold; num? get payableGold => _payableGold; String? get startAt => _startAt; String? get expireAt => _expireAt; SCVipLevelConfigRes? get targetConfig => _targetConfig; int get targetLevelInt => (_targetLevel ?? 0).toInt(); Map toJson() { final map = {}; map['userId'] = _userId; map['sysOrigin'] = _sysOrigin; map['orderType'] = _orderType; map['currentLevel'] = _currentLevel; map['targetLevel'] = _targetLevel; map['durationDays'] = _durationDays; map['originalPriceGold'] = _originalPriceGold; map['payableGold'] = _payableGold; map['startAt'] = _startAt; map['expireAt'] = _expireAt; if (_targetConfig != null) { map['targetConfig'] = _targetConfig?.toJson(); } return map; } } class SCVipPurchaseRes { SCVipPurchaseRes({ bool? success, SCVipOrderRes? order, SCVipStatusRes? state, }) { _success = success; _order = order; _state = state; } SCVipPurchaseRes.fromJson(dynamic json) { final map = _asMap(json); if (map == null) return; _success = _boolValue(map['success']); final orderMap = _asMap(map['order']); _order = orderMap != null && orderMap.isNotEmpty ? SCVipOrderRes.fromJson(orderMap) : null; final stateMap = _asMap(map['state']); _state = stateMap != null && stateMap.isNotEmpty ? SCVipStatusRes.fromJson(stateMap) : null; } bool? _success; SCVipOrderRes? _order; SCVipStatusRes? _state; bool? get success => _success; SCVipOrderRes? get order => _order; SCVipStatusRes? get state => _state; Map toJson() { final map = {}; map['success'] = _success; if (_order != null) map['order'] = _order?.toJson(); if (_state != null) map['state'] = _state?.toJson(); return map; } } class SCVipOrdersRes { SCVipOrdersRes({List? records, num? total}) { _records = records; _total = total; } SCVipOrdersRes.fromJson(dynamic json) { final map = _asMap(json); if (map == null) return; _records = _asList( map['records'], ).map((dynamic item) => SCVipOrderRes.fromJson(item)).toList(); _total = _numValue(map['total']); } List? _records; num? _total; List get records => _records ?? []; num? get total => _total; Map toJson() { final map = {}; map['records'] = records.map((item) => item.toJson()).toList(); map['total'] = _total; return map; } } class SCVipOrderRes { SCVipOrderRes({ String? id, String? eventId, String? sysOrigin, String? userId, String? orderType, num? fromLevel, num? toLevel, num? durationDays, num? originalPriceGold, num? paidGold, String? status, String? startAt, String? expireAt, }) { _id = id; _eventId = eventId; _sysOrigin = sysOrigin; _userId = userId; _orderType = orderType; _fromLevel = fromLevel; _toLevel = toLevel; _durationDays = durationDays; _originalPriceGold = originalPriceGold; _paidGold = paidGold; _status = status; _startAt = startAt; _expireAt = expireAt; } SCVipOrderRes.fromJson(dynamic json) { final map = _asMap(json); if (map == null) return; _id = _stringValue(map['id']); _eventId = _stringValue(map['eventId']); _sysOrigin = _stringValue(map['sysOrigin']); _userId = _stringValue(map['userId']); _orderType = _stringValue(map['orderType']); _fromLevel = _numValue(map['fromLevel']); _toLevel = _numValue(map['toLevel']); _durationDays = _numValue(map['durationDays']); _originalPriceGold = _numValue(map['originalPriceGold']); _paidGold = _numValue(map['paidGold']); _status = _stringValue(map['status']); _startAt = _stringValue(map['startAt']); _expireAt = _stringValue(map['expireAt']); } String? _id; String? _eventId; String? _sysOrigin; String? _userId; String? _orderType; num? _fromLevel; num? _toLevel; num? _durationDays; num? _originalPriceGold; num? _paidGold; String? _status; String? _startAt; String? _expireAt; String? get id => _id; String? get eventId => _eventId; String? get sysOrigin => _sysOrigin; String? get userId => _userId; String? get orderType => _orderType; num? get fromLevel => _fromLevel; num? get toLevel => _toLevel; num? get durationDays => _durationDays; num? get originalPriceGold => _originalPriceGold; num? get paidGold => _paidGold; String? get status => _status; String? get startAt => _startAt; String? get expireAt => _expireAt; Map toJson() { final map = {}; map['id'] = _id; map['eventId'] = _eventId; map['sysOrigin'] = _sysOrigin; map['userId'] = _userId; map['orderType'] = _orderType; map['fromLevel'] = _fromLevel; map['toLevel'] = _toLevel; map['durationDays'] = _durationDays; map['originalPriceGold'] = _originalPriceGold; map['paidGold'] = _paidGold; map['status'] = _status; map['startAt'] = _startAt; map['expireAt'] = _expireAt; return map; } } Map? _asMap(dynamic value) { if (value is Map) return value; if (value is Map) return Map.from(value); return null; } List _asList(dynamic value) { if (value is List) return value; return []; } SCVipResourceRes? _resourceValue(dynamic value) { final map = _asMap(value); if (map == null || map.isEmpty) return null; return SCVipResourceRes.fromJson(map); } String? _stringValue(dynamic value) { if (value == null) return null; return value.toString(); } num? _numValue(dynamic value) { if (value == null) return null; if (value is num) return value; return num.tryParse(value.toString()); } bool? _boolValue(dynamic value) { if (value == null) return null; if (value is bool) return value; if (value is num) return value != 0; final lower = value.toString().toLowerCase(); if (lower == 'true') return true; if (lower == 'false') return false; return null; } String? _firstNonBlank(Iterable values) { for (final value in values) { final text = value?.trim(); if (text != null && text.isNotEmpty) { return text; } } return null; } bool _isSvgaUrl(String value) { final lower = value.toLowerCase(); return lower.endsWith('.svga') || lower.contains('.svga?'); }