// packages/service_api/lib/services/lobby_helper_service.dart import 'dart:developer'; import 'package:service_api/service_api.dart'; /// [수정됨] 로비 화면의 중복 로직(랭킹, 레벨)을 처리하는 공통 서비스 class LobbyHelperService { final IdentityService _identityService; final PuzzleService _puzzleService; LobbyHelperService({ required IdentityService identityService, required PuzzleService puzzleService, }) : _identityService = identityService, _puzzleService = puzzleService; /// (가벼움) 현재 게임의 최대 레벨만 로드 Future loadMaxLevel(String gameType) async { return await _identityService.getMaxUnlockedLevel(gameType: gameType); } /// [🔥 수정됨] (무거움) 랭킹 변동 이력(▲▼)을 반환 (levelIndex 추출기능 주입) Future> loadRankHistory({ required String gameType, required String myName, required List allLevels, required int Function(T level) getLevelIndex, // 👈 [수정] levelIndex 추출 함수 }) async { try { final Map oldRankMap = await _identityService.getLastSavedRankMap(gameType: gameType); List>> rankFutures = []; for (final level in allLevels) { rankFutures.add(_puzzleService.fetchRanks(gameType, level.contextId)); } final List> allRankResults = await Future.wait(rankFutures); Map newRankMapForStorage = {}; Map newRankHistoryForState = {}; for (int i = 0; i < allLevels.length; i++) { final level = allLevels[i]; final currentRanks = allRankResults[i]; // [🔥 수정] 주입받은 함수로 levelIndex를 안전하게 추출 final int levelIndex = getLevelIndex(level); final int oldRank = oldRankMap[levelIndex] ?? 0; int currentRank = 0; int myRankIndex = currentRanks.indexWhere((r) => r.playerName == myName); if (myRankIndex != -1) { currentRank = myRankIndex + 1; } newRankMapForStorage[levelIndex] = currentRank; newRankHistoryForState[levelIndex] = (oldRank, currentRank); } await _identityService.saveLastRankMap(newRankMapForStorage, gameType: gameType); log("$gameType 랭킹 변동 확인 완료. (유저: $myName)"); return newRankHistoryForState; } catch (e) { log("LobbyHelperService($gameType): 랭킹 확인 실패: $e"); rethrow; } } }