import 'package:cdb_ui/api.dart'; import 'package:cdb_ui/pages/expandable_list.dart'; import 'package:cdb_ui/pages/transaction.dart'; import 'package:flutter/material.dart'; class StatsPage extends StatelessWidget { const StatsPage({super.key}); Future<(List, List, GlobalItemStat)> _fetchData() async { return ( await API().getItemsUnderMin(), await API().getExpiredItems(), await API().getGlobalItemStat() ); } @override Widget build(BuildContext context) { // todo : add global statistics // todo : demand stat // todo : stat on origin + destination // global origin / destinations return Scaffold( appBar: AppBar( title: const Text("Home"), ), body: FutureBuilder( future: _fetchData(), builder: (context, snapshot) { if (!snapshot.hasData) { return const CircularProgressIndicator(); } var data = snapshot.data!; var min = data.$1; var expired = data.$2; var globalStat = data.$3; return Column( children: [ Card( margin: const EdgeInsets.all(10.0), child: Padding( padding: const EdgeInsets.all(10.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ IconText(Icons.data_object, "Items: ${globalStat.itemCount}"), IconText(Icons.list_alt, "Inventory: ${globalStat.totalTransactions}"), IconText(Icons.money, "Price: ${globalStat.totalPrice.toStringAsFixed(2)} €") ], ), )), if (min.isNotEmpty) const ListTile( title: Text( "Items under Minimum", style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20), )), ...min.map((item) { var (itemID, variant) = itemVariant(item.itemVariant); var name = API().getItem(itemID).variants[variant]!.name; return ListTile( title: Text("$name under minimum. Needs ${item.need} more."), ); }).toList(), if (expired.isNotEmpty) const ListTile( title: Text( "Expired Items", style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20), )), // Mapping expired list to widgets ...expired.map((item) { return ListTile( title: TransactionCard(item, () {}), ); }).toList(), ], ); }, ), ); } } class ItemStatPage extends StatelessWidget { final Item item; const ItemStatPage(this.item, {super.key}); // todo : avg time of transaction active ExpandableListItem buildVariantStat(String variant) { return ExpandableListItem( body: FutureBuilder( future: API().getStat(item.id, variant, full: true), builder: (context, snapshot) { if (!snapshot.hasData) { return const CircularProgressIndicator(); } var data = snapshot.data! as FullItemVariantStat; return Column( children: [ Text("Amount: ${data.amount}"), Text("Total Cost: ${data.totalPrice}"), Text("Expiry Rate: ${data.expiryRate}"), ...data.origins.keys.map((key) { var originStat = data.origins[key]!; return Column(children: [ Text("Inventory: ${originStat.inventory}"), Text( "Average Price: ${originStat.averagePrice.toStringAsFixed(2)} €"), ]); }).toList() ], ); }, ), header: Text(item.variants[variant]!.name)); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Statistics of ${item.name}"), ), body: Column(children: [ ExpandableList(item.variants.keys.map(buildVariantStat).toList()) ]), ); } }