Files
PlayMaker/lib/controllers/stats_controller.dart
2026-01-14 10:40:31 +00:00

176 lines
6.6 KiB
Dart

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import '../models/person_model.dart';
class StatsController {
final FirebaseFirestore _db = FirebaseFirestore.instance;
// --- LÓGICA DE FIREBASE ---
// GRAVAR: Cria o personagem numa sub-coleção dentro da equipa
Future<void> addPerson(String teamId, String name, String type, String number) async {
await _db.collection('teams').doc(teamId).collection('members').add({
'name': name,
'type': type,
'number': number,
'createdAt': FieldValue.serverTimestamp(),
});
}
// LER: Vai buscar todos os membros da equipa em tempo real
Stream<List<Person>> getMembers(String teamId) {
return _db
.collection('teams')
.doc(teamId)
.collection('members')
.orderBy('createdAt', descending: false) // Organiza por ordem de criação
.snapshots()
.map((snapshot) => snapshot.docs
.map((doc) => Person.fromFirestore(doc.data(), doc.id))
.toList());
}
// --- Adiciona estas funções dentro da classe StatsController ---
// ELIMINAR: Remove o documento da sub-coleção
Future<void> deletePerson(String teamId, String personId) async {
await _db
.collection('teams')
.doc(teamId)
.collection('members')
.doc(personId)
.delete();
}
// EDITAR (LOGICA): Abre o popup já preenchido com os dados atuais
void showEditPersonDialog(BuildContext context, String teamId, Person person) {
final nameController = TextEditingController(text: person.name);
final numberController = TextEditingController(text: person.number);
String selectedType = person.type;
showDialog(
context: context,
builder: (context) => StatefulBuilder(
builder: (context, setPopupState) => AlertDialog(
title: const Text("Editar Personagem"),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
DropdownButtonFormField<String>(
value: selectedType,
items: ['Jogador', 'Treinador'].map((t) => DropdownMenuItem(value: t, child: Text(t))).toList(),
onChanged: (val) => setPopupState(() => selectedType = val!),
decoration: const InputDecoration(labelText: 'Tipo'),
),
TextField(controller: nameController, decoration: const InputDecoration(labelText: 'Nome')),
if (selectedType == 'Jogador')
TextField(controller: numberController, decoration: const InputDecoration(labelText: 'Número')),
],
),
actions: [
TextButton(onPressed: () => Navigator.pop(context), child: const Text("Cancelar")),
ElevatedButton(
onPressed: () async {
await _db.collection('teams').doc(teamId).collection('members').doc(person.id).update({
'name': nameController.text,
'type': selectedType,
'number': selectedType == 'Jogador' ? numberController.text : '',
});
if (context.mounted) Navigator.pop(context);
},
child: const Text("Guardar Alterações"),
),
],
),
),
);
}
// --- LÓGICA DE INTERFACE (POPUP) ---
void showAddPersonDialog(BuildContext context, String teamId) {
String selectedType = 'Jogador';
final TextEditingController nameController = TextEditingController();
final TextEditingController numberController = TextEditingController();
showDialog(
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setPopupState) {
return AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
title: const Text('Novo Personagem'),
content: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Seletor: Jogador ou Treinador
DropdownButtonFormField<String>(
value: selectedType,
decoration: const InputDecoration(labelText: 'Tipo'),
items: ['Jogador', 'Treinador']
.map((t) => DropdownMenuItem(value: t, child: Text(t)))
.toList(),
onChanged: (val) {
setPopupState(() {
selectedType = val!;
});
},
),
const SizedBox(height: 15),
// Campo Nome
TextField(
controller: nameController,
textCapitalization: TextCapitalization.words,
decoration: const InputDecoration(
labelText: 'Nome Completo',
hintText: 'Ex: Stephen Curry',
),
),
// Campo Número (Aparece apenas se for Jogador)
if (selectedType == 'Jogador') ...[
const SizedBox(height: 15),
TextField(
controller: numberController,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'Número da Camisola',
hintText: 'Ex: 30',
),
),
],
],
),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('Cancelar'),
),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF00C853),
),
onPressed: () async {
if (nameController.text.isNotEmpty) {
// CHAMA A FUNÇÃO DE GRAVAR DO FIREBASE
await addPerson(
teamId,
nameController.text,
selectedType,
selectedType == 'Jogador' ? numberController.text : '',
);
if (context.mounted) Navigator.pop(context);
}
},
child: const Text('Guardar', style: TextStyle(color: Colors.white)),
),
],
);
},
);
},
);
}
}