package no.ntnu.idatt1002.demo.controller;

import java.io.IOException;
import java.time.LocalDate;
import javafx.collections.FXCollections;
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.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.AnchorPane;
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.ExpenseRegister;
import no.ntnu.idatt1002.demo.data.Economics.IncomeRegister;

public class MainMenu {

  @FXML
  private Label balanceLbl;
  @FXML
  private ProgressBar bookBar;

  @FXML
  private Label bookLbl;

  @FXML
  private Button budgetBtn;

  @FXML
  private ProgressBar clothesBar;

  @FXML
  private Label clothesLbl;

  @FXML
  private DatePicker date;

  @FXML
  private Button expenseBtn;

  @FXML
  private ProgressBar foodBar;

  @FXML
  private Button foodBtn;

  @FXML
  private Label foodLbl;

  @FXML
  private Button incomeBtn;

  @FXML
  private ProgressBar mainBar;

  @FXML
  private ProgressBar otherBar;

  @FXML
  private Label otherLbl;

  @FXML
  private Button returnBtn;

  @FXML
  private Label title;

  @FXML
  private Label usageLbl;

  @FXML
  private AnchorPane root;

  @FXML
  private Label daysLeftLbl;

  GeneralBudget generalBudget;

  ExpenseRegister expenseRegister;

  IncomeRegister incomeRegister;

  @FXML
  public void initialize() throws IOException { //TODO NEED TO SET STATUSBAR VALUES
    //Initialize all controllers
    initializeControllers();

    double incomeSum = incomeRegister.getTotalSum();
    double expenseSum = expenseRegister.getTotalSum();

    //Set progress
    mainBar.setProgress(expenseSum/incomeSum);

    //Displaying month
    title.setText("BUDGET " + (LocalDate.now().getMonth()));
    double balance = incomeSum - expenseSum;
    //Set balance
    balanceLbl.setText("Balance: " + (balance));
    //Displaying how much of the monthly budget has been spent.
    usageLbl.setText("Used " + expenseSum + " out of " + 1000);

    if (balance < 0) {
      balanceLbl.setTextFill(Color.RED);
    }

    //Make calendar uneditable
    formatDatePicker();
    daysLeftLbl.setText("Days left: 31");
    //date.restrict
  }

  /**
   * 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.
   */
  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");
  }

  /**
   * Method for disabling the date picker, yet having its opacity at max.
   */
  private void formatDatePicker() {
    date.setValue(LocalDate.now());
    date.setDisable(true);
    date.setStyle("-fx-opacity: 1");
    date.getEditor().setStyle("-fx-opacity: 1");
  }
  @FXML
  private void switchScene(ActionEvent event) throws IOException {
    FXMLLoader loader = new FXMLLoader();
    if (event.getSource() == foodBtn) {
      System.out.println("Food button pressed");
    } else if (event.getSource() == expenseBtn) {
      loader.setLocation(getClass().getResource("/view/IncomeAndExpenses.fxml"));
    }  else if (event.getSource() == incomeBtn) {
      loader.setLocation(getClass().getResource("/view/IncomeAndExpenses.fxml"));
    } else if (event.getSource() == budgetBtn) {
      loader.setLocation(getClass().getResource("/view/BudgetNewest.fxml"));
    } else if (event.getSource() == returnBtn) {
      loader.setLocation(getClass().getResource("/view/FirstMenu.fxml"));
    }
    Parent root = loader.load();
    Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.show();
  }
}