import '../../models/subscription.dart';
import '../../models/subscription_model.dart';
import '../../utils/logger.dart';

class SubscriptionFilter {
  // 중복 구독 필터링 (서비스명과 금액이 같으면 중복으로 간주)
  List<Subscription> filterDuplicates(
      List<Subscription> scanned, List<SubscriptionModel> existing) {
    Log.d(
        '_filterDuplicates: 스캔된 구독 ${scanned.length}개, 기존 구독 ${existing.length}개');

    // 중복되지 않은 구독만 필터링
    return scanned.where((scannedSub) {
      // 기존 구독 중에 같은 서비스명과 월 비용을 가진 것이 있는지 확인
      final isDuplicate = existing.any((existingSub) {
        final isSameName = existingSub.serviceName.toLowerCase() ==
            scannedSub.serviceName.toLowerCase();
        final isSameCost = existingSub.monthlyCost == scannedSub.monthlyCost;

        if (isSameName && isSameCost) {
          Log.d(
              '중복 발견: ${scannedSub.serviceName} (${scannedSub.monthlyCost}원)');
          return true;
        }
        return false;
      });

      return !isDuplicate;
    }).toList();
  }

  // 반복 횟수 기반 필터링
  List<Subscription> filterByRepeatCount(
      List<Subscription> subscriptions, int minCount) {
    return subscriptions.where((sub) => sub.repeatCount >= minCount).toList();
  }

  // 날짜 기반 필터링 (선택적)
  List<Subscription> filterByDateRange(
      List<Subscription> subscriptions, DateTime startDate, DateTime endDate) {
    return subscriptions.where((sub) {
      return sub.nextBillingDate.isAfter(startDate) &&
          sub.nextBillingDate.isBefore(endDate);
    }).toList();
  }

  // 금액 기반 필터링 (선택적)
  List<Subscription> filterByPriceRange(
      List<Subscription> subscriptions, double minPrice, double maxPrice) {
    return subscriptions
        .where(
            (sub) => sub.monthlyCost >= minPrice && sub.monthlyCost <= maxPrice)
        .toList();
  }

  // 카테고리 기반 필터링 (선택적)
  List<Subscription> filterByCategories(
      List<Subscription> subscriptions, List<String> categoryIds) {
    if (categoryIds.isEmpty) return subscriptions;

    return subscriptions.where((sub) {
      return sub.category != null && categoryIds.contains(sub.category);
    }).toList();
  }
}
