import '../data/service_data_repository.dart';
import '../data/legacy_service_data.dart';

/// 카테고리 매핑 관련 기능을 제공하는 서비스 클래스
class CategoryMapperService {
  final ServiceDataRepository _dataRepository;

  CategoryMapperService(this._dataRepository);

  /// 서비스명으로 카테고리 찾기
  Future<String?> findCategoryByServiceName(String serviceName) async {
    if (serviceName.isEmpty) return null;

    final lowerName = serviceName.toLowerCase().trim();

    // JSON 데이터가 있으면 JSON에서 찾기
    final servicesData = _dataRepository.getServicesData();
    if (servicesData != null) {
      final categories = servicesData['categories'] as Map<String, dynamic>;

      for (final categoryEntry in categories.entries) {
        final categoryId = categoryEntry.key;
        final categoryData = categoryEntry.value as Map<String, dynamic>;
        final services = categoryData['services'] as Map<String, dynamic>;

        for (final serviceData in services.values) {
          final names = List<String>.from(
              (serviceData as Map<String, dynamic>)['names'] ?? []);

          for (final name in names) {
            if (lowerName.contains(name.toLowerCase()) ||
                name.toLowerCase().contains(lowerName)) {
              return getCategoryIdByKey(categoryId);
            }
          }
        }
      }
    }

    // JSON에서 못 찾았으면 레거시 방식으로 카테고리 추측
    return getCategoryForLegacyService(serviceName);
  }

  /// 카테고리 키를 실제 카테고리 ID로 매핑
  String getCategoryIdByKey(String key) {
    // 여기에 실제 앱의 카테고리 ID 매핑을 추가
    // 임시로 카테고리명 기반 매핑
    switch (key) {
      case 'music':
        return 'music_streaming';
      case 'ott':
        return 'ott_services';
      case 'storage':
        return 'cloud_storage';
      case 'ai':
        return 'ai_services';
      case 'programming':
        return 'dev_tools';
      case 'office':
        return 'office_tools';
      case 'lifestyle':
        return 'lifestyle';
      case 'shopping':
        return 'shopping';
      case 'gaming':
        return 'gaming';
      case 'telecom':
        return 'telecom';
      default:
        return 'other';
    }
  }

  /// 레거시 서비스명으로 카테고리 추측
  String getCategoryForLegacyService(String serviceName) {
    final lowerName = serviceName.toLowerCase();

    if (LegacyServiceData.ottServices.containsKey(lowerName)) {
      return 'ott_services';
    }
    if (LegacyServiceData.musicServices.containsKey(lowerName)) {
      return 'music_streaming';
    }
    if (LegacyServiceData.storageServices.containsKey(lowerName)) {
      return 'cloud_storage';
    }
    if (LegacyServiceData.aiServices.containsKey(lowerName)) {
      return 'ai_services';
    }
    if (LegacyServiceData.programmingServices.containsKey(lowerName)) {
      return 'dev_tools';
    }
    if (LegacyServiceData.officeTools.containsKey(lowerName)) {
      return 'office_tools';
    }
    if (LegacyServiceData.lifestyleServices.containsKey(lowerName)) {
      return 'lifestyle';
    }
    if (LegacyServiceData.shoppingServices.containsKey(lowerName)) {
      return 'shopping';
    }
    if (LegacyServiceData.telecomServices.containsKey(lowerName)) {
      return 'telecom';
    }

    return 'other';
  }
}
