package nordh.xyz;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.RadioButton;
import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import nordh.xyz.Database.DatabaseConnection;
import nordh.xyz.objects.Recepie;
/**
* Denna ska planera X rätter. (Default 5) Rätterna ska vara varierade, t.ex. 1
* pasta, 1 fisk, 1 gryta/soppa osv.. Den ska i framtiden hålla koll på om man
* haft receptet tidigare och inte ge samma igen. Man ska kunna betygsätta
* recepten i efterhand (barn, vuxen.. eller varje familjemedlem)
*
*
* == Kanske för en egen panel==
*
*
* Det måste finna ett sätt att klassa maträtterna, och spara detta i en
* databas. om det är Vegetariskt, Veganskt, pasta, fisk, soppa, efterrätt,
* huvudrätt.. någon form av taggning.
*
*
*/
public class PlannerController {
@FXML
Pane recepiePane;
@FXML
ListView generatedRecepiesListView;
@FXML
VBox generateSettingsVBox;
protected boolean andSelected = true;
@FXML
public void initialize() {
generatedRecepiesListView.getSelectionModel().selectedItemProperty().addListener((event) -> {
updateRecepieView(generatedRecepiesListView.getSelectionModel().getSelectedItem());
});
generatedRecepiesListView.setCellFactory(param -> new ListCell() {
protected void updateItem(RecepieListViewItem item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
// EMPTY
} else {
setGraphic(item.getGui());
}
};
});
generateSettingsPanel();
}
private void generateSettingsPanel() {
List tags = DatabaseConnection.getInstance().getTags();
ToggleGroup buttonGroup = new ToggleGroup();
HBox buttonBox = new HBox();
buttonBox.setPadding(new Insets(10d));
RadioButton andRadiobutton = new RadioButton("AND");
RadioButton orRadiobutton = new RadioButton("OR");
andRadiobutton.setUserData("AND");
orRadiobutton.setUserData("OR");
andRadiobutton.setSelected(true);
andRadiobutton.setToggleGroup(buttonGroup);
orRadiobutton.setToggleGroup(buttonGroup);
buttonBox.getChildren().addAll(andRadiobutton, orRadiobutton);
generateSettingsVBox.getChildren().add(buttonBox);
buttonGroup.selectedToggleProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue extends Toggle> ov, Toggle oldValue, Toggle newValue) {
andSelected = newValue.getUserData().equals("AND");
}
});
for (String tag : tags) {
generateSettingsVBox.getChildren().add(new CheckBox(tag));
}
}
@FXML
private void switchToMain() throws IOException {
App.setRoot("main");
}
@FXML
private void GenerateRecepie() {
ObservableList children = generateSettingsVBox.getChildren();
List selectedBoxs = children.stream().filter(p -> p instanceof CheckBox).map(m -> (CheckBox) m)
.filter(p -> p.isSelected()).collect(Collectors.toList());
if (selectedBoxs.size() == 0) {
addRandomRecepieToListView();
} else {
addRandomRecepieToListView(selectedBoxs);
}
}
private void addRandomRecepieToListView(List selectedBoxs) {
List selectedTags = selectedBoxs.stream().map(m -> m.getText()).collect(Collectors.toList());
Recepie r = DatabaseConnection.getInstance().getRandomRecepie(selectedTags, andSelected);
int counter = 100;
boolean failed = false;
if (r == null) {
failed = true;
showNoRecepiesAlert();
} else {
while (generatedRecepiesListView.getItems().stream().map(ri -> ri.getRecepie().getName())
.collect(Collectors.toList()).contains(r.getName())) {
r = DatabaseConnection.getInstance().getRandomRecepie(selectedTags, andSelected);
if (r == null || counter-- <= 0) {
showNoRecepiesAlert();
failed = true;
break;
}
}
}
if (!failed) {
generatedRecepiesListView.getItems().add(new RecepieListViewItem(r));
}
}
private void showNoRecepiesAlert() {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setContentText("There are no more recepies");
alert.show();
}
private void addRandomRecepieToListView() {
Recepie r = DatabaseConnection.getInstance().getRandomRecepie();
int counter = 100;
boolean failed = false;
while (generatedRecepiesListView.getItems().stream().map(ri -> ri.getRecepie().getName())
.collect(Collectors.toList()).contains(r.getName())) {
r = DatabaseConnection.getInstance().getRandomRecepie();
if (r == null || counter-- <= 0) {
showNoRecepiesAlert();
failed = true;
break;
}
}
if (!failed) {
generatedRecepiesListView.getItems().add(new RecepieListViewItem(r));
}
}
private void updateRecepieView(RecepieListViewItem r) {
recepiePane.getChildren().clear();
if (r != null) {
recepiePane.getChildren().add(r.getRecepie().getGui());
}
}
private class RecepieListViewItem {
Recepie r;
Button rerollButton;
RecepieListViewItem(Recepie r) {
this.r = r;
rerollButton = new Button();
Image img = new Image("images/recycleArrowImageShrunk.jpg");
ImageView imgView = new ImageView(img);
imgView.prefHeight(20);
imgView.prefWidth(20);
imgView.maxHeight(20);
imgView.maxWidth(20);
rerollButton.setGraphic(imgView);
rerollButton.setOnMouseClicked((event) -> {
generatedRecepiesListView.getItems().remove(this);
GenerateRecepie();
});
}
public Recepie getRecepie() {
return r;
}
public Node getGui() {
HBox result = new HBox();
if (r == null || r.getName() == null || r.getName().equals("")) {
return result;
}
HBox.setHgrow(result, Priority.ALWAYS);
Label recepieName = new Label(r.toString());
recepieName.setPrefWidth(150d);
HBox.setHgrow(recepieName, Priority.ALWAYS);
result.getChildren().addAll(recepieName, rerollButton);
return result;
}
}
}