package controller;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import model.GameOfLife;
import model.Grid;
import view.MatrixPane;

import static java.util.Objects.requireNonNull;

/**
 * Controller for <i>The Game of Life</i> application.
 */
public class Controller {

    @FXML
    private ToggleButton playToggleButton;
    @FXML
    private ToggleButton pauseToggleButton;
    @FXML
    private Label generationNumberLabel;
    @FXML
    private MatrixPane matrixPane;

    private GameOfLife gameOfLife;

    @FXML
    private void initialize() {
        initializePlayAndPauseToggleButtons();
    }

    private void initializePlayAndPauseToggleButtons() {
        ToggleGroup toggleGroup = new PersistentToggleGroup();
        toggleGroup.getToggles().addAll(playToggleButton, pauseToggleButton);
        pauseToggleButton.setSelected(true);
    }


    /**
     * Sets {@link GameOfLife} instance.
     *
     * @param gameOfLife {@link GameOfLife} instance
     * @throws NullPointerException if {@code gameOfLife} is {@code null}
     */

    public void setGameOfLife(GameOfLife gameOfLife) {
        this.gameOfLife = requireNonNull(gameOfLife, "game of life is null");
        setGenerationNumberLabelTextProperty();
        initializeMatrixPane();
    }

    private void setGenerationNumberLabelTextProperty() {
        generationNumberLabel.textProperty().bind(gameOfLife.generationNumberProperty().asString());
    }

    private void initializeMatrixPane() {
        Grid grid = gameOfLife.getGrid();
        matrixPane.initialize(grid);
    }

    @FXML
    private void playToggleButtonAction() {
        gameOfLife.play();
    }

    @FXML
    private void pauseToggleButtonAction() {
        gameOfLife.pause();
    }

    @FXML
    private void resetButtonAction() {
        gameOfLife.reset();
        pauseToggleButton.setSelected(true);
    }

    @FXML
    private void clearButtonAction() {
        gameOfLife.clear();
        pauseToggleButton.setSelected(true);
    }
}