import 'package:flutter/material.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../models/person_model.dart'; class StatsController { final SupabaseClient _supabase = Supabase.instance.client; // 1. LER Stream> getMembers(String teamId) { return _supabase .from('members') .stream(primaryKey: ['id']) .eq('team_id', teamId) .order('name', ascending: true) .map((data) => data.map((json) => Person.fromMap(json)).toList()); } // 2. APAGAR Future deletePerson(String personId) async { try { await _supabase.from('members').delete().eq('id', personId); } catch (e) { debugPrint("Erro ao eliminar: $e"); } } // 3. DIÁLOGOS void showAddPersonDialog(BuildContext context, String teamId) { _showForm(context, teamId: teamId); } void showEditPersonDialog(BuildContext context, String teamId, Person person) { _showForm(context, teamId: teamId, person: person); } // --- O POPUP ESTÁ AQUI --- void _showForm(BuildContext context, {required String teamId, Person? person}) { final isEdit = person != null; final nameCtrl = TextEditingController(text: person?.name ?? ''); final numCtrl = TextEditingController(text: person?.number ?? ''); // Define o valor inicial String selectedType = person?.type ?? 'Jogador'; showDialog( context: context, builder: (ctx) => StatefulBuilder( builder: (ctx, setState) => AlertDialog( title: Text(isEdit ? "Editar" : "Adicionar"), content: Column( mainAxisSize: MainAxisSize.min, children: [ // NOME TextField( controller: nameCtrl, decoration: const InputDecoration(labelText: "Nome"), textCapitalization: TextCapitalization.sentences, ), const SizedBox(height: 10), // FUNÇÃO DropdownButtonFormField( value: selectedType, decoration: const InputDecoration(labelText: "Função"), items: ["Jogador", "Treinador"] .map((e) => DropdownMenuItem(value: e, child: Text(e))) .toList(), onChanged: (v) { if (v != null) setState(() => selectedType = v); }, ), // NÚMERO (Só aparece se for Jogador) if (selectedType == "Jogador") ...[ const SizedBox(height: 10), TextField( controller: numCtrl, decoration: const InputDecoration(labelText: "Número da Camisola"), keyboardType: TextInputType.text, // Aceita texto para evitar erros ), ], ], ), actions: [ TextButton( onPressed: () => Navigator.pop(ctx), child: const Text("Cancelar") ), ElevatedButton( style: ElevatedButton.styleFrom(backgroundColor: const Color(0xFF00C853)), onPressed: () async { print("--- 1. CLICOU EM GUARDAR ---"); // Validação Simples if (nameCtrl.text.trim().isEmpty) { print("ERRO: Nome vazio"); return; } // Lógica do Número: // Se for Treinador -> envia NULL // Se for Jogador e estiver vazio -> envia NULL // Se tiver texto -> envia o Texto String? numeroFinal; if (selectedType == "Treinador") { numeroFinal = null; } else { numeroFinal = numCtrl.text.trim().isEmpty ? null : numCtrl.text.trim(); } print("--- 2. DADOS A ENVIAR ---"); print("Nome: ${nameCtrl.text}"); print("Tipo: $selectedType"); print("Número: $numeroFinal"); try { if (isEdit) { await _supabase.from('members').update({ 'name': nameCtrl.text.trim(), 'type': selectedType, 'number': numeroFinal, }).eq('id', person!.id); } else { await _supabase.from('members').insert({ 'team_id': teamId, // Verifica se este teamId é válido! 'name': nameCtrl.text.trim(), 'type': selectedType, 'number': numeroFinal, }); } print("--- 3. SUCESSO! FECHANDO DIÁLOGO ---"); if (ctx.mounted) Navigator.pop(ctx); } catch (e) { print("--- X. ERRO AO GUARDAR ---"); print(e.toString()); // MOSTRA O ERRO NO TELEMÓVEL if (ctx.mounted) { ScaffoldMessenger.of(ctx).showSnackBar( SnackBar( content: Text("Erro: $e"), backgroundColor: Colors.red, duration: const Duration(seconds: 4), ), ); } } }, child: const Text("Guardar", style: TextStyle(color: Colors.white)), ) ], ), ), ); } }