StartController.java

package edu.ntnu.idi.idatt.view.entry;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.List;

import edu.ntnu.idi.idatt.model.Exchange;
import edu.ntnu.idi.idatt.model.market.Stock;
import edu.ntnu.idi.idatt.model.player.Player;
import edu.ntnu.idi.idatt.storage.SessionManager;
import edu.ntnu.idi.idatt.storage.StockParser;
import edu.ntnu.idi.idatt.view.SceneFactory;
import edu.ntnu.idi.idatt.view.SceneManager;
import edu.ntnu.idi.idatt.view.components.AbstractController;
import javafx.stage.FileChooser;

/**
 * Class for Start MVC Controller.
 */
public class StartController extends AbstractController<StartModel> {

  private File csv;

  /**
   * Constructor for StartController.
   * 
   * @param model - StartModel instance.
   */
  public StartController(StartModel model) {
    super(model);
  }

  /**
   * Method to obtain a user specified CSV file.
   */
  public void obtainCSVFile() {
    csv = new FileChooser().showOpenDialog(null);
    if (csv != null) {
      model.getFileName().set(csv.getName());
    }
  }

  /**
   * Method for initializing the game.
   *
   * <p>
   * Handles initial logic and fills the UserSession
   * with the new instance.
   * </p>
   */
  public void initializeGame() {
    model.getError().set(" "); // Empty buffers

    if (model.getName().get() == null) {
      model.getError().set("Name field can't be empty");
      return;
    }

    if (model.getName().get().isBlank()) {
      model.getError().set("Name field can't be empty!");
      return;
    }

    boolean loadResult = SessionManager.loadSession(model.getName().get());
    if (loadResult) {
      SceneManager.switchTo(SceneFactory.createExchangeView());
      return;
    } else {
      model.isNewGame().set(true);
    }

    if (model.isFirstNewGame()) {
      model.getError().set("No player with this name found. Create new player.");
      model.setFirstNewGame(false);
      return;
    }

    if (model.getBalance().get() == null) {
      model.getError().set("Balance field can't be empty");
      return;
    }

    if (model.getBalance().get().isBlank()) {
      model.getError().set("Balance field can't be empty!");
      return;
    }

    BigDecimal balance = null;
    try {
      balance = new BigDecimal(model.getBalance().get());
    } catch (NumberFormatException e) {
      model.getError().set("The balance must be a number format!");
      return;
    }

    List<Stock> stocks;
    if (model.isPredefinedCSV().get()) {
      InputStream ISpredefinedCSV = this.getClass()
          .getResourceAsStream("/stocks.csv");

      try {
        stocks = StockParser.loadFromResource(ISpredefinedCSV);
      } catch (IOException e) {
        model.getError().set(e.getMessage());
        return;
      }

    } else {
      if (csv == null) {
        model.getError().set("Specify the stocks .csv file!");
        return;
      }

      try {
        stocks = StockParser.loadFromFile(csv.getPath());
      } catch (IOException e) {
        model.getError().set(e.getMessage());
        return;
      }
    }

    if (stocks == null || stocks.isEmpty()) {
      model.getError().set("Failed to load stocks!");
      return;
    }

    Player player = new Player(model.getName().get(), balance);
    Exchange exchange = new Exchange(player.getName(), stocks);
    SessionManager.newSession(player, exchange);
    SessionManager.saveSession();
    SceneManager.switchTo(SceneFactory.createExchangeView());
  }

}