import 'package:flutter/material.dart'; import 'package:seshat/domain/models/enums.dart'; import 'package:seshat/domain/models/return_owner.dart'; import 'package:seshat/domain/models/search_result.dart'; import 'package:seshat/ui/bal_page/view_model/bal_view_model.dart'; import 'package:seshat/ui/bal_page/widget/ended/stats_tab.dart'; import 'package:seshat/ui/core/ui/navigation_bar.dart'; class BalEndedScreen extends StatefulWidget { const BalEndedScreen({super.key, required this.viewModel}); final BalViewModel viewModel; @override State createState() => _BalEndedScreenState(); } class _BalEndedScreenState extends State with TickerProviderStateMixin { late final TabController tabController; @override void initState() { super.initState(); tabController = TabController(length: 2, vsync: this); } @override Widget build(BuildContext context) { return Scaffold( bottomNavigationBar: AppNavigationBar(startIndex: 0), appBar: AppBar( title: Text(widget.viewModel.bal!.name), bottom: TabBar( controller: tabController, tabs: [ Tab(text: "Statistiques"), Tab( text: "À rendre (${widget.viewModel.owedToOwners?.length.toString() ?? "0"})", ), ], ), ), body: ListenableBuilder( listenable: widget.viewModel, builder: (context, child) { return TabBarView( controller: tabController, children: [ StatsTab(viewModel: widget.viewModel), ReturnTab(viewModel: widget.viewModel), ], ); }, ), ); } } class ReturnTab extends StatelessWidget { const ReturnTab({super.key, required this.viewModel}); final BalViewModel viewModel; @override Widget build(BuildContext context) { return ListView( children: [ (viewModel.owedToOwners?.isEmpty ?? true) ? Center( child: Padding( padding: const EdgeInsets.all(10.0), child: Text("Tout a été rendu"), ), ) : SizedBox(), for (ReturnOwner owedToOwner in viewModel.owedToOwners!) Padding( padding: const EdgeInsets.symmetric(horizontal: 10.0), child: Card( child: ListTile( title: Text( "${owedToOwner.owner?.firstName ?? 'Erreur'} ${owedToOwner.owner?.lastName ?? 'Erreur'}", ), subtitle: Text( "${owedToOwner.owed.length.toString()} livres · ${owedToOwner.owedMoney.toString()}€", ), trailing: IconButton( onPressed: () { showDialog( context: context, builder: (context) => ReturnPopup( viewModel: viewModel, currentOwedToOwner: owedToOwner, ), ); }, icon: Icon(Icons.visibility), ), ), ), ), ], ); } } class ReturnPopup extends StatelessWidget { const ReturnPopup({ super.key, required this.viewModel, required this.currentOwedToOwner, }); final BalViewModel viewModel; final ReturnOwner currentOwedToOwner; @override Widget build(BuildContext context) { return ListenableBuilder( listenable: viewModel, builder: (context, child) { return AlertDialog( title: Text( "${currentOwedToOwner.owner?.firstName ?? 'Erreur'} ${currentOwedToOwner.owner?.lastName ?? 'Erreur'}", ), content: Column( mainAxisSize: MainAxisSize.min, children: [ Text( "Argent à rembourser : ${currentOwedToOwner.owedMoney}€", style: TextStyle(fontSize: 20), ), SizedBox( height: 300, width: 300, child: ListView( children: [ (currentOwedToOwner.owed.isEmpty) ? Text("Tout a été rendu") : SizedBox(), for (SearchResult book in currentOwedToOwner.owed) Card( child: ListTile( title: Text(book.book.title), subtitle: Text( "${book.book.author} · ${currentOwedToOwner.owner!.firstName[0].toUpperCase()}${currentOwedToOwner.owner!.lastName[0].toUpperCase()}${book.instance.price}", ), ), ), ], ), ), ], ), actions: [ (currentOwedToOwner.owedMoney != 0) ? TextButton( onPressed: () async { await viewModel.returnById( ReturnType.money, currentOwedToOwner.ownerId, ); }, child: Text("Argent rendu"), ) : SizedBox(), (currentOwedToOwner.owed.isNotEmpty) ? TextButton( onPressed: () async { await viewModel.returnById( ReturnType.books, currentOwedToOwner.ownerId, ); }, child: Text("Livres rendus"), ) : SizedBox(), TextButton( onPressed: () async { await viewModel.returnById( ReturnType.all, currentOwedToOwner.ownerId, ); if (context.mounted) { Navigator.of(context).pop(); } }, child: Text("Tout rendu"), ), TextButton( onPressed: () { Navigator.of(context).pop(); }, child: Text("Annuler"), ), ], ); }, ); } }