import 'package:flutter/material.dart'; import '../models/subscription_model.dart'; import '../providers/category_provider.dart'; import '../services/subscription_url_matcher.dart'; /// 구독 서비스를 카테고리별로 구분하는 도우미 클래스 class SubscriptionCategoryHelper { /// 구독 서비스 목록을 카테고리별로 그룹화하여 반환 /// /// [subscriptions] 구독 목록 /// [categoryProvider] 카테고리 제공자 /// /// 반환값: 카테고리 이름을 키로 하고 해당 카테고리에 속하는 구독 목록을 값으로 가지는 Map static Map> categorizeSubscriptions( List subscriptions, CategoryProvider categoryProvider, ) { 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가 없거나 카테고리를 찾을 수 없는 경우 서비스 이름 기반 분류 // OTT if (_isInCategory( subscription.serviceName, SubscriptionUrlMatcher.ottServices)) { if (!categorizedSubscriptions.containsKey('OTT 서비스')) { categorizedSubscriptions['OTT 서비스'] = []; } categorizedSubscriptions['OTT 서비스']!.add(subscription); } // 음악 else if (_isInCategory( subscription.serviceName, SubscriptionUrlMatcher.musicServices)) { if (!categorizedSubscriptions.containsKey('음악 서비스')) { categorizedSubscriptions['음악 서비스'] = []; } categorizedSubscriptions['음악 서비스']!.add(subscription); } // AI else if (_isInCategory( subscription.serviceName, SubscriptionUrlMatcher.aiServices)) { if (!categorizedSubscriptions.containsKey('AI 서비스')) { categorizedSubscriptions['AI 서비스'] = []; } categorizedSubscriptions['AI 서비스']!.add(subscription); } // 프로그래밍/개발 else if (_isInCategory(subscription.serviceName, SubscriptionUrlMatcher.programmingServices)) { if (!categorizedSubscriptions.containsKey('프로그래밍/개발 서비스')) { categorizedSubscriptions['프로그래밍/개발 서비스'] = []; } categorizedSubscriptions['프로그래밍/개발 서비스']!.add(subscription); } // 오피스/협업 툴 else if (_isInCategory( subscription.serviceName, SubscriptionUrlMatcher.officeTools)) { if (!categorizedSubscriptions.containsKey('오피스/협업 툴')) { categorizedSubscriptions['오피스/협업 툴'] = []; } categorizedSubscriptions['오피스/협업 툴']!.add(subscription); } // 기타 서비스 else if (_isInCategory( subscription.serviceName, SubscriptionUrlMatcher.otherServices)) { if (!categorizedSubscriptions.containsKey('기타 서비스')) { categorizedSubscriptions['기타 서비스'] = []; } categorizedSubscriptions['기타 서비스']!.add(subscription); } // 미분류된 서비스 else { if (!categorizedSubscriptions.containsKey('미분류')) { categorizedSubscriptions['미분류'] = []; } categorizedSubscriptions['미분류']!.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))); } }