import 'package:supabase_flutter/supabase_flutter.dart';

class TeamController {
  final _supabase = Supabase.instance.client;

  // 1. Variável fixa para guardar o Stream principal
  late final Stream<List<Map<String, dynamic>>> teamsStream;

  // 2. Dicionário (Cache) para não recriar Streams de contagem repetidos
  final Map<String, Stream<int>> _playerCountStreams = {};

  TeamController() {
    // INICIALIZAÇÃO: O stream é criado APENAS UMA VEZ quando abres a página!
    teamsStream = _supabase
        .from('teams')
        .stream(primaryKey: ['id'])
        .order('name', ascending: true)
        .map((data) => List<Map<String, dynamic>>.from(data));
  }

  // CRIAR
  Future<void> createTeam(String name, String season, String? imageUrl) async {
    try {
      await _supabase.from('teams').insert({
        'name': name,
        'season': season,
        'image_url': imageUrl,
        'is_favorite': false,
      });
      print("✅ Equipa guardada no Supabase!");
    } catch (e) {
      print("❌ Erro ao criar: $e");
    }
  }

  // ELIMINAR
  Future<void> deleteTeam(String id) async {
    try {
      await _supabase.from('teams').delete().eq('id', id);
      // Limpa o cache deste teamId se a equipa for apagada
      _playerCountStreams.remove(id);
    } catch (e) {
      print("❌ Erro ao eliminar: $e");
    }
  }

  // FAVORITAR
  Future<void> 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");
    }
  }

  // CONTAR JOGADORES (AGORA COM CACHE DE MEMÓRIA!)
  Stream<int> getPlayerCountStream(String teamId) {
    // Se já criámos um "Tubo de ligação" para esta equipa, REUTILIZA-O!
    if (_playerCountStreams.containsKey(teamId)) {
      return _playerCountStreams[teamId]!;
    }

    // Se é a primeira vez que pede esta equipa, cria a ligação e guarda na memória
    final newStream = _supabase
        .from('members')
        .stream(primaryKey: ['id'])
        .eq('team_id', teamId)
        .map((data) => data.length);
        
    _playerCountStreams[teamId] = newStream; // Guarda no dicionário
    return newStream;
  }

  // LIMPEZA FINAL QUANDO SAÍMOS DA PÁGINA
  void dispose() {
    // Limpamos o dicionário de streams para libertar memória RAM
    _playerCountStreams.clear();
  }
}