From b183c13bd1f92b1ed7c610129a2b64f5b8aeb3e3 Mon Sep 17 00:00:00 2001
From: Harry Linrui XU <xulr0820@hotmail.com>
Date: Sun, 16 Apr 2023 14:46:15 +0200
Subject: [PATCH] Added methods for loading in registers + set progress for
 mini progressbars

---
 .../idatt1002/demo/controller/MainMenu.java   | 135 ++++++++++++++----
 1 file changed, 110 insertions(+), 25 deletions(-)

diff --git a/src/main/java/no/ntnu/idatt1002/demo/controller/MainMenu.java b/src/main/java/no/ntnu/idatt1002/demo/controller/MainMenu.java
index 14dd1ef7..b8230ee0 100644
--- a/src/main/java/no/ntnu/idatt1002/demo/controller/MainMenu.java
+++ b/src/main/java/no/ntnu/idatt1002/demo/controller/MainMenu.java
@@ -2,13 +2,18 @@ package no.ntnu.idatt1002.demo.controller;
 
 import java.io.IOException;
 import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.List;
 import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Node;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.Button;
 import javafx.scene.control.DatePicker;
 import javafx.scene.control.Label;
@@ -18,8 +23,11 @@ import javafx.scene.paint.Color;
 import javafx.stage.Stage;
 import no.ntnu.idatt1002.demo.data.Budget.FileHandlingBudget;
 import no.ntnu.idatt1002.demo.data.Budget.GeneralBudget;
+import no.ntnu.idatt1002.demo.data.Economics.ExpenseCategory;
 import no.ntnu.idatt1002.demo.data.Economics.ExpenseRegister;
+import no.ntnu.idatt1002.demo.data.Economics.FileHandling;
 import no.ntnu.idatt1002.demo.data.Economics.IncomeRegister;
+import no.ntnu.idatt1002.demo.data.Economics.Overview;
 
 public class MainMenu {
 
@@ -88,56 +96,132 @@ public class MainMenu {
 
   IncomeRegister incomeRegister;
 
+  FileHandling fileHandling;
+
+  Overview overview;
+
   @FXML
-  public void initialize() throws IOException { //TODO NEED TO SET STATUSBAR VALUES
-    //Initialize all controllers
-    initializeControllers();
+  public void initialize() {
+    fileHandling = new FileHandling();
+    //Initialize all registers + overview
+    try {
+      incomeRegister = loadIncomeDataFromFile("Income");
+      expenseRegister = loadExpenseDataFromFile("Expense");
+      generalBudget = loadBudgetDataFromFile("Budget");
+    } catch (IOException ioe) {
+      Alert alert = new Alert(AlertType.ERROR);
+      alert.setTitle("Could not load register data");
+      alert.setHeaderText("Could not load register data");
+      alert.setContentText("There was an error loading in the registers");
+
+      alert.showAndWait();
+    }
+    overview = new Overview(incomeRegister, expenseRegister, generalBudget);
 
     mainBar.setStyle("-fx-accent: green;");
 
-    double incomeSum = incomeRegister.getTotalSum();
-    double expenseSum = expenseRegister.getTotalSum();
+    refreshProgressBars();
+    refreshLabels();
+    //Set progress when opening scene
 
-    //Set progress
-    mainBar.setProgress(expenseSum/incomeSum);
+    double maxAmount = generalBudget.getMaxAmount();
+    double expenseSum = expenseRegister.getTotalSum();
 
     //Displaying month
     title.setText("BUDGET " + (LocalDate.now().getMonth()));
-    double balance = incomeSum - expenseSum;
+    double balance = maxAmount - expenseSum;
     //Set balance
     balanceLbl.setText("Balance: " + (balance));
     //Displaying how much of the monthly budget has been spent.
-    usageLbl.setText("Used " + expenseSum + " out of " + 1000);
+    usageLbl.setText("Used " + expenseSum + " out of " + generalBudget.getMaxAmount());
 
     if (balance < 0) {
       balanceLbl.setTextFill(Color.RED);
     }
-
     //Make calendar uneditable
     formatDatePicker();
     daysLeftLbl.setText("Days left: 31");
     //date.restrict
   }
 
+  private void refreshLabels() {
+
+  }
+
   /**
-   * Method for initializing all controllers in order to load all necessary data for this screen.
-   * Made this a separate method in order to make initialize() less cluttered.
-   * @throws IOException If there is an error with reading the files.
+   * Sets the progress of the progress bars to their most updated data.
    */
-  private void initializeControllers() throws IOException {
-    //Instantiate income controller and register
-    IncomeController incomeController = new IncomeController();
-    incomeRegister = incomeController.loadIncomeDataFromFile("Income");
-
-    //Instantiate expense controller and register
-    ExpensesController expensesController = new ExpensesController();
-    expenseRegister = expensesController.loadExpenseDataFromFile("Expense");
-
-    //Instantiate budget controller and register
-    BudgetController budgetController = new BudgetController();
-    generalBudget = budgetController.loadBudgetDataFromFile("Budget");
+  private void refreshProgressBars() {
+    mainBar.setProgress(expenseRegister.getTotalSum()/generalBudget.getMaxAmount());
+
+    foodBar.setProgress((generalBudget.getBudgetItem(ExpenseCategory.FOOD).getBudgetAmount() - overview.getBudgetItemMinusExpense(ExpenseCategory.FOOD))/generalBudget.getBudgetItem(ExpenseCategory.FOOD).getBudgetAmount());
+    clothesBar.setProgress((generalBudget.getBudgetItem(ExpenseCategory.CLOTHES).getBudgetAmount() - overview.getBudgetItemMinusExpense(ExpenseCategory.CLOTHES))/generalBudget.getBudgetItem(ExpenseCategory.CLOTHES).getBudgetAmount());
+    bookBar.setProgress((generalBudget.getBudgetItem(ExpenseCategory.BOOKS).getBudgetAmount() - overview.getBudgetItemMinusExpense(ExpenseCategory.BOOKS))/generalBudget.getBudgetItem(ExpenseCategory.BOOKS).getBudgetAmount());
+    otherBar.setProgress((generalBudget.getBudgetItem(ExpenseCategory.OTHER).getBudgetAmount() - overview.getBudgetItemMinusExpense(ExpenseCategory.OTHER))/generalBudget.getBudgetItem(ExpenseCategory.OTHER).getBudgetAmount());
   }
 
+  /**
+   * Method that either reads data from a file with which it fills an income register, if older changes exist, or instantiates an income register if the file is empty.
+   * @param fileName The name of the file that is being read from.
+   * @return An object of type IncomeRegister.
+   * @throws IOException If an error occurs while reading from the file.
+   */
+  public IncomeRegister loadIncomeDataFromFile(String fileName) throws IOException {
+    //Instantiate incomeRegister
+    if (fileHandling.isEmpty(fileName)) {
+      incomeRegister = new IncomeRegister();
+    } else { //Load previous income register
+      try {
+        incomeRegister = fileHandling.readIncomeRegisterFromFile(fileName);
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    }
+    return incomeRegister;
+  }
+
+  /**
+   * Method that either reads data from a file with which it fills an expense register, if older changes exist, or instantiates an expense register if the file is empty.
+   * @param fileName The name of the file that is being read from.
+   * @return An object of type IncomeRegister.
+   * @throws IOException If an error occurs while reading from the file.
+   */
+  public ExpenseRegister loadExpenseDataFromFile(String fileName) throws IOException {
+    //Instantiate expense register
+    if (fileHandling.isEmpty(fileName)) {
+      expenseRegister = new ExpenseRegister();
+    } else {
+      try {
+        expenseRegister = fileHandling.readExpenseRegisterFromFile(fileName);
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    }
+    return expenseRegister;
+  }
+
+  /**
+   * Method that either reads data from a file with which it fills a budget register, if this is an old budget, or instantiates a budget register if this is a new budget.
+   * @param fileName The name of the file that is being read from.
+   * @return An object of type GeneralBudget.
+   * @throws IOException If an error occurs while reading from the file.
+   */
+  public GeneralBudget loadBudgetDataFromFile(String fileName) throws IOException {
+    FileHandlingBudget fileHandlingBudget = new FileHandlingBudget();
+    //Instantiate new budget
+    if (fileHandlingBudget.isEmpty(fileName)) {
+      generalBudget = new GeneralBudget(31, 1000);
+    } else { //Load previous budget
+      try {
+        generalBudget = fileHandlingBudget.readGeneralBudgetFromFile(fileName);
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    }
+    return generalBudget;
+  }
+
+
   /**
    * Method for disabling the date picker, yet having its opacity at max.
    */
@@ -147,6 +231,7 @@ public class MainMenu {
     date.setStyle("-fx-opacity: 1");
     date.getEditor().setStyle("-fx-opacity: 1");
   }
+
   @FXML
   private void switchScene(ActionEvent event) throws IOException {
     FXMLLoader loader = new FXMLLoader();
-- 
GitLab