Skip to content
Snippets Groups Projects
IncomeController.java 6.93 KiB
package no.ntnu.idatt1002.demo.controller;

import java.io.IOException;

import java.util.Optional;
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.ButtonType;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Dialog;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.text.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;
import no.ntnu.idatt1002.demo.data.Economics.Income;
import no.ntnu.idatt1002.demo.data.Economics.IncomeCategory;
import no.ntnu.idatt1002.demo.data.Economics.IncomeRegister;
import no.ntnu.idatt1002.demo.data.Economics.FileHandling;

public class IncomeController {

  /**
   * The mode of the dialog. NEW if new contact, EDIT if edit existing contact.
   */
  private DialogMode dialogMode;
  @FXML
  private Button addBtn;
  @FXML
  private Button editBtn;

  @FXML
  private Button deleteBtn;

  @FXML
  private ComboBox<String> show;

  @FXML
  private Button expenseBtn;

  @FXML
  private Button overviewBtn;

  @FXML
  private Button budgetBtn;
  @FXML
  private Button returnBtn;

  @FXML
  private Text sum;
  @FXML
  private TableColumn<Income, Double> amountColumn;

  @FXML
  private TableColumn<Income, IncomeCategory> categoryColumn;

  @FXML
  private TableColumn<Income, String> dateColumn;

  @FXML
  private TableColumn<Income, String> descriptionColumn;

  @FXML
  private TableColumn<Income, Boolean> recurringColumn;

  @FXML
  private TableView<Income> incomeTableView;

  IncomeRegister incomeRegister;
  ObservableList<Income> income;

  ObservableList<String> filter;

  @FXML
  public void initialize() throws IOException {
    dateColumn.setCellValueFactory(new PropertyValueFactory<Income, String>("date"));
    amountColumn.setCellValueFactory(new PropertyValueFactory<Income, Double>("amount"));
    categoryColumn.setCellValueFactory(new PropertyValueFactory<Income, IncomeCategory>("category"));
    descriptionColumn.setCellValueFactory(new PropertyValueFactory<Income, String>("description"));
    recurringColumn.setCellValueFactory(new PropertyValueFactory<Income, Boolean>("recurring"));

    filter = FXCollections.observableArrayList("All", "Gift", "Salary", "Student loan", "Fixed income");
    show.setItems(filter);
    show.setValue("All");

    incomeRegister = loadIncomeDataFromFile("Income");
    income = FXCollections.observableArrayList(incomeRegister.getItems());
    incomeTableView.setItems(income);

    sum.setText(String.valueOf(incomeRegister.getTotalSum()));
    //if budget.register isEmpty -> disable expense
  }

  @FXML
  protected void handleAddButton(ActionEvent event) {
    handleEditButton(event);
  }

  @FXML
  protected void handleEditButton(ActionEvent event) {
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("/view/AddIncome.fxml"));
    Income newIncome = null;
    String dialogTitle = "";
    // Load the FXML file for your dialog box
    Dialog<Income> dialog = new Dialog<>();
    dialog.initModality(Modality.APPLICATION_MODAL);

    try {
      // Set the Dialog's content to the loaded FXML file
      dialog.getDialogPane().setContent(loader.load());
    } catch (IOException e) {
      e.printStackTrace();
    }

    // Get the controller for the loaded FXML file
    AddIncomeController dialogController = loader.getController();

    if (event.getSource().equals(addBtn)) {
      dialogMode = DialogMode.ADD;
      dialogTitle = "Add income";
    } else if (event.getSource().equals(editBtn)
        && incomeTableView.getSelectionModel().getSelectedItem() != null) {
      dialogMode = DialogMode.EDIT;
      dialogTitle = "Edit income";
      newIncome = incomeTableView.getSelectionModel().getSelectedItem();
      dialogController.setIncome(newIncome);
    } else {
      return;
    }

    dialog.setTitle(dialogTitle);
    // Show the Dialog and wait for the user to close it
    dialog.showAndWait();
    //Get the newly created income from the dialog pane
    newIncome = dialogController.getNewIncome();

    if (newIncome != null && dialogMode == DialogMode.ADD) {
      incomeRegister.addItem(newIncome);
    }
    refreshTableView();
  }
  //Only add the income to the tableview, if the income is not null

  @FXML
  public void handleDeleteBtn(ActionEvent event) {
    Income chosenIncome = incomeTableView.getSelectionModel().getSelectedItem();
    if (chosenIncome == null) {
      return;
    }
    Optional<ButtonType> isConfirmed = showConfirmationDialog();
    if (isConfirmed.isPresent() && isConfirmed.get() == ButtonType.OK) {
      incomeRegister.removeItem(chosenIncome);
      refreshTableView();
    }
  }

  protected void refreshTableView() {
    this.income.setAll(incomeRegister.getItems());
    this.sum.setText(String.valueOf(incomeRegister.getTotalSum()));
  }

  private Optional<ButtonType> showConfirmationDialog() {
    Alert alert = new Alert(AlertType.CONFIRMATION);
    alert.setTitle("Confirm Delete");
    alert.setHeaderText("Delete Confirmation");
    alert.setContentText("Are you sure you would like to delete the selected entry?");

    return alert.showAndWait();
  }

  public IncomeRegister loadIncomeDataFromFile(String fileName) throws IOException {
    FileHandling fileHandling = new FileHandling();
    if (fileHandling.isEmpty(fileName)) {
      incomeRegister = new IncomeRegister();
      System.out.println("hey");
    } else {
      try {
        incomeRegister = fileHandling.readIncomeRegisterFromFile(fileName);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return incomeRegister;
  }

  public void saveDataToFile(String fileName) throws IOException {
    FileHandling fileHandling = new FileHandling();
    fileHandling.writeItemRegisterToFile(incomeRegister, fileName);
  }

  @FXML
  public void switchScene(ActionEvent event) throws IOException {
    saveDataToFile("Income");
    FXMLLoader loader = new FXMLLoader();
    if (event.getSource() == expenseBtn) {
      loader.setLocation(SceneController.class.getResource("/view/Expenses.fxml"));
    } else if (event.getSource() == overviewBtn) {
      loader.setLocation(SceneController.class.getResource("/view/Overview.fxml"));
    } else if (event.getSource() == returnBtn) {
      loader.setLocation(SceneController.class.getResource("/view/FirstMenu.fxml"));
    } else if (event.getSource() == budgetBtn) {
      loader.setLocation(SceneController.class.getResource("/view/BudgetNew.fxml"));
    }
      Parent root = loader.load();
      Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
      Scene scene = new Scene(root);
      stage.setScene(scene);
      stage.show();
    }
  }