import 'dart:io'; import 'package:supabase_flutter/supabase_flutter.dart'; class TeamController { final _supabase = Supabase.instance.client; // 1. STREAM (Realtime) Stream>> get teamsStream { return _supabase .from('teams') .stream(primaryKey: ['id']) .order('name', ascending: true) .map((data) => List>.from(data)); } // 2. CRIAR (Agora aceita um File e faz o Upload!) Future createTeam(String name, String season, File? imageFile) async { try { String? uploadedImageUrl; // Se o utilizador escolheu uma imagem, fazemos o upload primeiro if (imageFile != null) { // Criar um nome único para o ficheiro (ex: id do user + timestamp) final userId = _supabase.auth.currentUser?.id ?? 'default'; final fileName = '${userId}_${DateTime.now().millisecondsSinceEpoch}.png'; final storagePath = 'teams/$fileName'; // Faz o upload para o bucket 'avatars' (podes usar o mesmo ou criar um chamado 'teams_logos') await _supabase.storage.from('avatars').upload( storagePath, imageFile, fileOptions: const FileOptions(cacheControl: '3600', upsert: true) ); // Vai buscar o URL público uploadedImageUrl = _supabase.storage.from('avatars').getPublicUrl(storagePath); } // Agora insere a equipa na base de dados (com ou sem URL) await _supabase.from('teams').insert({ 'name': name, 'season': season, 'image_url': uploadedImageUrl ?? '', // Se não houver foto, guarda vazio 'is_favorite': false, }); print("✅ Equipa guardada no Supabase!"); } catch (e) { print("❌ Erro ao criar equipa: $e"); } } // 3. ELIMINAR Future deleteTeam(String id) async { try { await _supabase.from('teams').delete().eq('id', id); } catch (e) { print("❌ Erro ao eliminar: $e"); } } // 4. FAVORITAR Future toggleFavorite(String teamId, bool currentStatus) async { try { await _supabase .from('teams') .update({'is_favorite': !currentStatus}) .eq('id', teamId); } catch (e) { print("❌ Erro ao favoritar: $e"); } } // 5. CONTAR JOGADORES (LEITURA ÚNICA) Future getPlayerCount(String teamId) async { try { final count = await _supabase.from('members').count().eq('team_id', teamId); return count; } catch (e) { return 0; } } // 6. CONTAR JOGADORES (STREAM EM TEMPO REAL) Future>> getTeamsWithStats() async { final data = await _supabase .from('teams_with_stats') // Lemos da View que criámos! .select('*') .order('name', ascending: true); return List>.from(data); } void dispose() {} }