import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:frontend_splatournament_manager/models/tournament.dart'; import 'package:frontend_splatournament_manager/services/api_client.dart'; class TournamentProvider extends ChangeNotifier { List _availableTournaments = []; Future>? _initialLoadFuture; List get availableTournaments => _availableTournaments; Future> _fetchTournaments() async { final response = await ApiClient.get('/tournaments'); if (response.statusCode != HttpStatus.ok) { throw Exception('Failed to load tournaments (${response.statusCode})'); } final List list = json.decode(response.body); return list.map((json) => Tournament.fromJson(json)).toList(); } Future> fetchAvailableTournaments() async { _availableTournaments = await _fetchTournaments(); notifyListeners(); return _availableTournaments; } Future> ensureTournamentsLoaded() { _initialLoadFuture ??= fetchAvailableTournaments(); return _initialLoadFuture!; } Future> refreshAvailableTournaments() { _initialLoadFuture = fetchAvailableTournaments(); return _initialLoadFuture!; } Future createTournament( String name, String description, int maxTeamAmount, DateTime registrationStartDate, DateTime registrationEndDate, ) async { final response = await ApiClient.post( '/tournaments', { 'name': name, 'description': description, 'maxTeamAmount': maxTeamAmount, 'registrationStartDate': registrationStartDate.toIso8601String().split('T')[0], 'registrationEndDate': registrationEndDate.toIso8601String().split('T')[0], }, ); if (response.statusCode != HttpStatus.created) { throw Exception('Failed to create tournament (${response.statusCode})'); } await refreshAvailableTournaments(); } }