import 'package:flutter/material.dart'; import 'package:frontend_splatournament_manager/models/team.dart'; import 'package:frontend_splatournament_manager/services/team_service.dart'; class TeamProvider extends ChangeNotifier { final TeamService _teamService = TeamService(); List _teams = []; List _userTeams = []; Future>? _initialLoadFuture; Future>? _userTeamsFuture; List get teams => _teams; List get userTeams => _userTeams; Future> fetchAllTeams() async { _teams = await _teamService.getAllTeams(); notifyListeners(); return _teams; } Future> ensureTeamsLoaded() { _initialLoadFuture ??= fetchAllTeams(); return _initialLoadFuture!; } Future> refreshTeams() { _initialLoadFuture = fetchAllTeams(); return _initialLoadFuture!; } Future> fetchUserTeams() async { _userTeams = await _teamService.getUserTeams(); notifyListeners(); return _userTeams; } Future> ensureUserTeamsLoaded() { _userTeamsFuture ??= fetchUserTeams(); return _userTeamsFuture!; } Future createTeam({ required String name, required String tag, String description = '', }) async { final team = await _teamService.createTeam( name: name, tag: tag, description: description, ); _teams = [..._teams, team]; notifyListeners(); return team; } Future updateTeam( int id, { String? name, String? tag, String? description, }) async { await _teamService.updateTeam( id, name: name, tag: tag, description: description, ); await refreshTeams(); } Future deleteTeam(int id) async { await _teamService.deleteTeam(id); _teams = _teams.where((t) => t.id != id).toList(); notifyListeners(); } Future> getTeamsByTournament(int tournamentId) async { return _teamService.getTeamsByTournament(tournamentId); } Future registerTeamForTournament(int tournamentId, int teamId) async { await _teamService.registerTeamForTournament(tournamentId, teamId); notifyListeners(); } Future removeTeamFromTournament(int tournamentId, int teamId) async { await _teamService.removeTeamFromTournament(tournamentId, teamId); notifyListeners(); } Future> getUserTeams() { return _teamService.getUserTeams(); } Future joinTeam(int teamId) async { await _teamService.joinTeam(teamId); await _refreshMembership(); } Future leaveTeam(int teamId) async { await _teamService.leaveTeam(teamId); await _refreshMembership(); } Future _refreshMembership() async { await Future.wait([ _teamService.getAllTeams().then((t) => _teams = t), _teamService.getUserTeams().then((t) => _userTeams = t), ]); notifyListeners(); } Future>> getTeamMembers(int teamId) { return _teamService.getTeamMembers(teamId); } Future>> getMyTeamsTournaments() async { final userTeams = await getUserTeams(); final Set> tournamentsSet = {}; for (final team in userTeams) { try { final tournaments = await _teamService.getTournamentsByTeam(team.id); tournamentsSet.addAll(tournaments); } catch (e) { // If a team has no tournaments, continue with others } } return tournamentsSet.toList(); } }