diff --git a/lib/controllers/placar_controller.dart b/lib/controllers/placar_controller.dart index 81c7ac1..3492a89 100644 --- a/lib/controllers/placar_controller.dart +++ b/lib/controllers/placar_controller.dart @@ -56,57 +56,82 @@ class PlacarController { Timer? timer; bool isRunning = false; - // --- INICIALIZAÇÃO E BD --- - Future loadPlayers() async { + Future loadPlayers() async { final supabase = Supabase.instance.client; try { - // 1. Buscar os IDs das equipas - final teamsResponse = await supabase.from('teams').select('id, name').inFilter('name', [myTeam, opponentTeam]); + // 1. Limpeza de segurança para evitar duplicados em "Hot Reload" + myCourt.clear(); myBench.clear(); oppCourt.clear(); oppBench.clear(); + playerStats.clear(); playerNumbers.clear(); playerDbIds.clear(); + myFouls = 0; opponentFouls = 0; + await Future.delayed(const Duration(milliseconds: 1500)); + + // 2. Buscar dados do JOGO (Placar) + final gameResponse = await supabase.from('games').select().eq('id', gameId).single(); + myScore = gameResponse['my_score'] ?? 0; + opponentScore = gameResponse['opponent_score'] ?? 0; + + // 3. Buscar IDs das Equipas + final teamsResponse = await supabase.from('teams').select('id, name').inFilter('name', [myTeam, opponentTeam]); for (var t in teamsResponse) { if (t['name'] == myTeam) myTeamDbId = t['id']; if (t['name'] == opponentTeam) oppTeamDbId = t['id']; } - // 2. Buscar os Jogadores - List myPlayers = myTeamDbId != null ? await supabase.from('members').select().eq('team_id', myTeamDbId!).eq('type', 'Jogador') : []; - List oppPlayers = oppTeamDbId != null ? await supabase.from('members').select().eq('team_id', oppTeamDbId!).eq('type', 'Jogador') : []; + // 4. Buscar Membros e ESTATÍSTICAS existentes + final myPlayers = myTeamDbId != null ? await supabase.from('members').select().eq('team_id', myTeamDbId!).eq('type', 'Jogador') : []; + final oppPlayers = oppTeamDbId != null ? await supabase.from('members').select().eq('team_id', oppTeamDbId!).eq('type', 'Jogador') : []; + + // Buscar todas as stats deste jogo de uma vez + final statsResponse = await supabase.from('player_stats').select().eq('game_id', gameId); + final Map savedStatsMap = { + for (var s in statsResponse) s['member_id'].toString(): s + }; - // 3. Registar a tua equipa + // 5. Processar Minha Equipa for (int i = 0; i < myPlayers.length; i++) { - _registerPlayer( - name: myPlayers[i]['name'].toString(), - number: myPlayers[i]['number']?.toString() ?? "0", - dbId: myPlayers[i]['id'].toString(), // Guarda o UUID real - isMyTeam: true, - isCourt: i < 5 - ); + String dbId = myPlayers[i]['id'].toString(); + String name = myPlayers[i]['name'].toString(); + _registerPlayer(name: name, number: myPlayers[i]['number']?.toString() ?? "0", dbId: dbId, isMyTeam: true, isCourt: i < 5); + + if (savedStatsMap.containsKey(dbId)) { + _injectStats(name, savedStatsMap[dbId], true); + } } _padTeam(myCourt, myBench, "Jogador", isMyTeam: true); - // 4. Registar a equipa adversária + // 6. Processar Adversário for (int i = 0; i < oppPlayers.length; i++) { - _registerPlayer( - name: oppPlayers[i]['name'].toString(), - number: oppPlayers[i]['number']?.toString() ?? "0", - dbId: oppPlayers[i]['id'].toString(), // Guarda o UUID real - isMyTeam: false, - isCourt: i < 5 - ); + String dbId = oppPlayers[i]['id'].toString(); + String name = oppPlayers[i]['name'].toString(); + _registerPlayer(name: name, number: oppPlayers[i]['number']?.toString() ?? "0", dbId: dbId, isMyTeam: false, isCourt: i < 5); + + if (savedStatsMap.containsKey(dbId)) { + _injectStats(name, savedStatsMap[dbId], false); + } } _padTeam(oppCourt, oppBench, "Adversário", isMyTeam: false); isLoading = false; onUpdate(); } catch (e) { - debugPrint("Erro ao carregar jogadores: $e"); - _padTeam(myCourt, myBench, "Falha", isMyTeam: true); - _padTeam(oppCourt, oppBench, "Falha Opp", isMyTeam: false); + debugPrint("Erro ao carregar: $e"); isLoading = false; onUpdate(); } } + // Função auxiliar para injetar os dados salvos + void _injectStats(String playerName, Map s, bool isMyTeam) { + playerStats[playerName] = { + "pts": s['pts'] ?? 0, "rbs": s['rbs'] ?? 0, "ast": s['ast'] ?? 0, + "stl": s['stl'] ?? 0, "tov": s['tov'] ?? 0, "blk": s['blk'] ?? 0, + "fls": s['fls'] ?? 0, "fgm": s['fgm'] ?? 0, "fga": s['fga'] ?? 0, + }; + if (isMyTeam) myFouls += (s['fls'] as int? ?? 0); + else opponentFouls += (s['fls'] as int? ?? 0); + } + void _registerPlayer({required String name, required String number, String? dbId, required bool isMyTeam, required bool isCourt}) { if (playerNumbers.containsKey(name)) name = "$name (Opp)";