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());
}
}