games/packages/service_api/lib/services/lobby_helper_service.dart
2025-11-19 11:17:33 +09:00

70 lines
2.5 KiB
Dart

// 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<int> loadMaxLevel(String gameType) async {
return await _identityService.getMaxUnlockedLevel(gameType: gameType);
}
/// [🔥 수정됨] (무거움) 랭킹 변동 이력(▲▼)을 반환 (levelIndex 추출기능 주입)
Future<Map<int, (int, int)>> loadRankHistory<T extends GameDifficulty>({
required String gameType,
required String myName,
required List<T> allLevels,
required int Function(T level) getLevelIndex, // 👈 [수정] levelIndex 추출 함수
}) async {
try {
final Map<int, int> oldRankMap =
await _identityService.getLastSavedRankMap(gameType: gameType);
List<Future<List<GameRankDto>>> rankFutures = [];
for (final level in allLevels) {
rankFutures.add(_puzzleService.fetchRanks(gameType, level.contextId));
}
final List<List<GameRankDto>> allRankResults =
await Future.wait(rankFutures);
Map<int, int> newRankMapForStorage = {};
Map<int, (int, int)> 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;
}
}
}