package dev.llan.view;
import dev.llan.controller.Controller;
import dev.llan.events.GameEvent;
import dev.llan.model.GameRecord;
import dev.llan.model.state.State;
import dev.llan.receivers.Observer;
import dev.llan.receivers.Receiver;
import dev.llan.view.game.EndView;
import dev.llan.view.game.GameView;
import dev.llan.view.game.TitleScreenView;
import dev.llan.view.game.WinView;
import dev.llan.view.game.modals.ModalManager;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import static dev.llan.view.game.map.Constants.*;
public class View implements RenderComponent, Observer {
private final Controller pc;
private final Stage stage;
private Scene scene;
private StackPane layout;
private final TitleScreenView titleView;
private final GameView gameView;
private final EndView endView;
private final WinView winView;
private final ModalManager modalManager;
private boolean gameControlsEnabled = false;
private boolean newGameCalled = false;
public View(Receiver receiver, Controller pc, Stage stage) {
this.pc = pc;
this.stage = stage;
layout = new StackPane();
initScene();
titleView = new TitleScreenView(this, receiver);
gameView = new GameView(this, pc, scene, layout);
endView = new EndView(this);
winView = new WinView(this);
layout.getChildren().add(titleView.render());
modalManager = new ModalManager(this, gameView, pc, layout);
}
private void initScene() {
this.scene = new Scene(this.render(), BASE_WIDTH, BASE_HEIGHT);
scene.getStylesheets().add("styles/main.css");
}
public Scene getScene() {
return scene;
}
public ModalManager getModalManager() {
return modalManager;
}
public void returnToHome() {
layout.getChildren().clear();
titleView.update();
layout.getChildren().add(titleView.render());
}
public void setGameView(boolean on) {
if (on) {
titleView.setLoading(true);
newGameCalled = true;
pc.newGame();
}
}
public boolean isGameControlsEnabled() {
return gameControlsEnabled;
}
@Override
public void update(GameEvent event) {
GameRecord gameRecord = event.getGame();
if (gameRecord.getGameState() == State.END) {
gameView.removeHandlers();
layout.getChildren().clear();
layout.getChildren().add(endView.render());
} else if (gameRecord.getGameState() == State.WIN) {
gameView.removeHandlers();
layout.getChildren().clear();
layout.getChildren().add(winView.render());
} else {
gameView.updateGameRecord(gameRecord);
modalManager.updateGameRecord(gameRecord);
}
if(newGameCalled) {
layout.getChildren().clear();
layout.getChildren().add(gameView.render());
gameControlsEnabled = true;
gameView.initHandlers();
newGameCalled = false;
titleView.setLoading(false);
}
if (event.getDisableControls()) {
gameControlsEnabled = false;
gameView.setControlsEnabled(false);
}
if(event.getEnableControls()) {
gameControlsEnabled = true;
gameView.setControlsEnabled(true);
}
}
@Override
public Parent render() {
return layout;
}
}