import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../services/sakenowa_service.dart'; import '../services/sakenowa_recommendation_service.dart'; import '../services/sakenowa_similar_recommendation_service.dart'; import '../services/sakenowa_auto_matching_service.dart'; import '../models/sakenowa/sakenowa_models.dart'; import '../models/sake_item.dart'; /// SakenowaServiceのシングルトンプロバイダー final sakenowaServiceProvider = Provider((ref) { return SakenowaService(); }); /// 銘柄データプロバイダー(キャッシュ付き) final sakenowaBrandsProvider = FutureProvider>((ref) async { final service = ref.watch(sakenowaServiceProvider); return service.getBrands(); }); /// 蔵元データプロバイダー final sakenowaBreweriesProvider = FutureProvider>((ref) async { final service = ref.watch(sakenowaServiceProvider); return service.getBreweries(); }); /// 地域データプロバイダー final sakenowaAreasProvider = FutureProvider>((ref) async { final service = ref.watch(sakenowaServiceProvider); return service.getAreas(); }); /// フレーバーチャートプロバイダー final sakenowaFlavorChartsProvider = FutureProvider>((ref) async { final service = ref.watch(sakenowaServiceProvider); return service.getFlavorCharts(); }); /// ランキングプロバイダー final sakenowaRankingsProvider = FutureProvider>((ref) async { final service = ref.watch(sakenowaServiceProvider); return service.getRankings(); }); /// 銘柄名検索プロバイダー final sakenowaBrandSearchProvider = FutureProvider.family, String>((ref, query) async { if (query.isEmpty) return []; final service = ref.watch(sakenowaServiceProvider); return service.searchBrandsByName(query); }); /// 銘柄IDからフレーバーチャートを取得 final sakenowaFlavorChartByBrandIdProvider = FutureProvider.family((ref, brandId) async { final service = ref.watch(sakenowaServiceProvider); return service.getFlavorChartByBrandId(brandId); }); /// SakenowaRecommendationServiceプロバイダー final sakenowaRecommendationServiceProvider = Provider((ref) { final sakenowaService = ref.watch(sakenowaServiceProvider); return SakenowaRecommendationService(sakenowaService); }); /// ✅ SakenowaSimilarRecommendationServiceプロバイダー final sakenowaSimilarRecommendationServiceProvider = Provider((ref) { final sakenowaService = ref.watch(sakenowaServiceProvider); return SakenowaSimilarRecommendationService(sakenowaService); }); /// ✅ 類似推薦プロバイダー(特定の日本酒に対する類似銘柄) /// [baseSake]: 基準となる日本酒 /// [userItems]: ユーザーの全日本酒リスト(除外判定用) final sakenowaSimilarRecommendationsProvider = FutureProvider.family< List, ({SakeItem baseSake, List? userItems}) >((ref, params) async { final service = ref.watch(sakenowaSimilarRecommendationServiceProvider); return service.getSimilarFromSakenowa( baseSake: params.baseSake, limit: 5, excludeOwned: true, userItems: params.userItems, ); }); /// ✅ SakenowaAutoMatchingServiceプロバイダー final sakenowaAutoMatchingServiceProvider = Provider((ref) { final sakenowaService = ref.watch(sakenowaServiceProvider); return SakenowaAutoMatchingService(sakenowaService); });