import 'package:flutter/material.dart'; import '../models/subscription_model.dart'; import '../providers/category_provider.dart'; import '../services/url_matcher/data/legacy_service_data.dart'; /// 구독 서비스를 카테고리별로 구분하는 도우미 클래스 class SubscriptionCategoryHelper { /// 구독 서비스 목록을 카테고리별로 그룹화하여 반환 /// /// [subscriptions] 구독 목록 /// [categoryProvider] 카테고리 제공자 /// [context] BuildContext for localization /// /// 반환값: 카테고리 이름을 키로 하고 해당 카테고리에 속하는 구독 목록을 값으로 가지는 Map static Map> categorizeSubscriptions( List subscriptions, CategoryProvider categoryProvider, BuildContext context, ) { final Map> categorizedSubscriptions = {}; // 카테고리 ID별로 구독 그룹화 for (final subscription in subscriptions) { if (subscription.categoryId != null) { // 카테고리 ID가 있는 경우, 해당 카테고리 이름으로 그룹화 final category = categoryProvider.getCategoryById(subscription.categoryId!); if (category != null) { final categoryName = category.name; if (!categorizedSubscriptions.containsKey(categoryName)) { categorizedSubscriptions[categoryName] = []; } categorizedSubscriptions[categoryName]!.add(subscription); continue; } } // 카테고리 ID가 없거나 카테고리를 찾을 수 없는 경우 서비스 이름 기반 분류 // 음악 if (_isInCategory( subscription.serviceName, LegacyServiceData.musicServices)) { if (!categorizedSubscriptions.containsKey('music')) { categorizedSubscriptions['music'] = []; } categorizedSubscriptions['music']!.add(subscription); } // OTT(동영상) else if (_isInCategory( subscription.serviceName, LegacyServiceData.ottServices)) { if (!categorizedSubscriptions.containsKey('ottVideo')) { categorizedSubscriptions['ottVideo'] = []; } categorizedSubscriptions['ottVideo']!.add(subscription); } // 저장/클라우드 else if (_isInCategory( subscription.serviceName, LegacyServiceData.storageServices)) { if (!categorizedSubscriptions.containsKey('storageCloud')) { categorizedSubscriptions['storageCloud'] = []; } categorizedSubscriptions['storageCloud']!.add(subscription); } // 통신 · 인터넷 · TV else if (_isInCategory( subscription.serviceName, LegacyServiceData.telecomServices)) { if (!categorizedSubscriptions.containsKey('telecomInternetTv')) { categorizedSubscriptions['telecomInternetTv'] = []; } categorizedSubscriptions['telecomInternetTv']!.add(subscription); } // 생활/라이프스타일 else if (_isInCategory( subscription.serviceName, LegacyServiceData.lifestyleServices)) { if (!categorizedSubscriptions.containsKey('lifestyle')) { categorizedSubscriptions['lifestyle'] = []; } categorizedSubscriptions['lifestyle']!.add(subscription); } // 쇼핑/이커머스 else if (_isInCategory( subscription.serviceName, LegacyServiceData.shoppingServices)) { if (!categorizedSubscriptions.containsKey('shoppingEcommerce')) { categorizedSubscriptions['shoppingEcommerce'] = []; } categorizedSubscriptions['shoppingEcommerce']!.add(subscription); } // 프로그래밍 else if (_isInCategory( subscription.serviceName, LegacyServiceData.programmingServices)) { if (!categorizedSubscriptions.containsKey('programming')) { categorizedSubscriptions['programming'] = []; } categorizedSubscriptions['programming']!.add(subscription); } // 협업/오피스 else if (_isInCategory( subscription.serviceName, LegacyServiceData.officeTools)) { if (!categorizedSubscriptions.containsKey('collaborationOffice')) { categorizedSubscriptions['collaborationOffice'] = []; } categorizedSubscriptions['collaborationOffice']!.add(subscription); } // AI 서비스 else if (_isInCategory( subscription.serviceName, LegacyServiceData.aiServices)) { if (!categorizedSubscriptions.containsKey('aiService')) { categorizedSubscriptions['aiService'] = []; } categorizedSubscriptions['aiService']!.add(subscription); } // 기타 else if (_isInCategory( subscription.serviceName, LegacyServiceData.otherServices)) { if (!categorizedSubscriptions.containsKey('other')) { categorizedSubscriptions['other'] = []; } categorizedSubscriptions['other']!.add(subscription); } // 미분류된 서비스 else { if (!categorizedSubscriptions.containsKey('uncategorized')) { categorizedSubscriptions['uncategorized'] = []; } categorizedSubscriptions['uncategorized']!.add(subscription); } } // 빈 카테고리 제거 categorizedSubscriptions.removeWhere((key, value) => value.isEmpty); return categorizedSubscriptions; } /// 서비스 이름이 특정 카테고리에 속하는지 확인 static bool _isInCategory( String serviceName, Map categoryServices) { final lowerServiceName = serviceName.toLowerCase(); return categoryServices.keys.any((key) => lowerServiceName.contains(key.toLowerCase()) || (key.isNotEmpty && key.toLowerCase().contains(lowerServiceName))); } }