From d46b3591c2245700c6f6fe606eaa4553daefe7b8 Mon Sep 17 00:00:00 2001
From: Harry Linrui XU <xulr0820@hotmail.com>
Date: Wed, 12 Apr 2023 10:19:16 +0200
Subject: [PATCH] Implemented pie charts display in BudgetController

---
 .../demo/controller/BudgetController.java     | 53 +++++++++++++------
 1 file changed, 36 insertions(+), 17 deletions(-)

diff --git a/src/main/java/no/ntnu/idatt1002/demo/controller/BudgetController.java b/src/main/java/no/ntnu/idatt1002/demo/controller/BudgetController.java
index 1325d296..76008f73 100644
--- a/src/main/java/no/ntnu/idatt1002/demo/controller/BudgetController.java
+++ b/src/main/java/no/ntnu/idatt1002/demo/controller/BudgetController.java
@@ -1,6 +1,9 @@
 package no.ntnu.idatt1002.demo.controller;
 
 import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.event.ActionEvent;
@@ -20,6 +23,7 @@ import javafx.stage.Stage;
 import no.ntnu.idatt1002.demo.data.Budget.BudgetItem;
 import no.ntnu.idatt1002.demo.data.Budget.FileHandlingBudget;
 import no.ntnu.idatt1002.demo.data.Budget.GeneralBudget;
+import no.ntnu.idatt1002.demo.data.Economics.Expense;
 import no.ntnu.idatt1002.demo.data.Economics.ExpenseCategory;
 
 
@@ -70,14 +74,16 @@ public class BudgetController implements FinanceController {
     @FXML
     private ObservableList<BudgetItem> budgetList;
 
+    @FXML
+    private PieChart budgetPieChart;
+
 
     /**
      * Initializes the budget register, the observable budget list and the tableview, along with the values of the dropbox used for filtering the tableview.
-     * @throws IOException If there occurs any exception when loading the budget register from a file.
      */
 
     @FXML
-    public void initialize() throws IOException {
+    public void initialize() {
         //TODO if budget is not empty (HAS VALUES) -> make uneditable -> EVENT FILTER TO CONTEXT MENU
         //TODO disable return to main menu when creating budget because this is the same view as when you create budeget
         //TODO make budget item throw exception with negative amount
@@ -88,29 +94,42 @@ public class BudgetController implements FinanceController {
         amountCol.setCellValueFactory(new PropertyValueFactory<BudgetItem, Double>("budgetAmount"));
         descriptionCol.setCellValueFactory(new PropertyValueFactory<BudgetItem, String>("budgetDescription"));
 
+        try {
+            general = loadBudgetDataFromFile("Budget");
+            budgetList = FXCollections.observableArrayList(general.getBudgetItems());
+            budgetTableView.setItems(budgetList);
+
+            refreshPieChart();
+        } catch(IOException ioe) {
+            sum.setText("Invalid budget file format");
+        } catch(IllegalArgumentException iae) {
+            sum.setText("Cannot load pie charts");
+        }
         //Initialize registers and tableview
-        general = loadBudgetDataFromFile("Budget");
-        budgetList = FXCollections.observableArrayList(general.getBudgetItems());
-        budgetTableView.setItems(budgetList);
+
 
         formatDatePicker();
-        //createBudgetPieChart();
         //Initialize sum field under the tableview
         //sum.setText(String.valueOf(general.totalSum()));
     }
 
-    private ObservableList<PieChart.Data> createBudgetPieChart() throws IllegalArgumentException { //TODO DOESNT WORK IF BUDGETITEM HAS NO BUDGET
-        try {
-            return FXCollections.observableArrayList(
-                new Data("Food", general.getBudgetItem(ExpenseCategory.FOOD).getBudgetAmount()),
-                new Data("Books", general.getBudgetItem(ExpenseCategory.BOOKS).getBudgetAmount()),
-                new Data("Clothes",
-                    general.getBudgetItem(ExpenseCategory.CLOTHES).getBudgetAmount()),
-                new Data("Other", general.getBudgetItem(ExpenseCategory.OTHER).getBudgetAmount())
-            );
-        } catch(IllegalArgumentException iae) {
-            return FXCollections.observableArrayList();
+    private List<ExpenseCategory> getChosenBudgetCategories() { //todo could be moved to generalbudget
+        return Arrays.stream(ExpenseCategory.values()).toList().
+            stream().filter(expenseCategory -> general.hasBudgetCategory(expenseCategory)).toList();
+    }
+    private ObservableList<PieChart.Data> createBudgetPieChart() throws IllegalArgumentException { //
+        ObservableList<PieChart.Data> budgetData = FXCollections.observableArrayList();
+        List<ExpenseCategory> chosenCategories = getChosenBudgetCategories();
+        for (ExpenseCategory category : chosenCategories) {
+            budgetData.add(new Data(category.toString().substring(0, 1).toUpperCase().
+                concat(category.toString().substring(1)),
+                    general.getBudgetItem(category).getBudgetAmount()));
         }
+        return budgetData;
+    }
+
+    private void refreshPieChart() {
+        this.budgetPieChart.setData(createBudgetPieChart());
     }
 
     /**
-- 
GitLab