package com.example.vpr_javafx;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class HelloController {

    @FXML
    private Label lMonH1;
    @FXML
    private Label lMonH2;
    @FXML
    private Label lMonD1;
    @FXML
    private Label lMonD2;
    @FXML
    private Label lTueH1;
    @FXML
    private Label lTueH2;
    @FXML
    private Label lTueD1;
    @FXML
    private Label lTueD2;
    @FXML
    private Label lWednH1;
    @FXML
    private Label lWednH2;
    @FXML
    private Label lWednD1;
    @FXML
    private Label lWednD2;
    @FXML
    private Label lThurH1;
    @FXML
    private Label lThurH2;
    @FXML
    private Label lThurD1;
    @FXML
    private Label lThurD2;
    @FXML
    private Label lFriH1;
    @FXML
    private Label lFriH2;
    @FXML
    private Label lFriD1;
    @FXML
    private Label lFriD2;

    @FXML
    private ImageView imgImage1;
    @FXML
    private ImageView imgImage2;
    @FXML
    private ImageView imgImage3;
    @FXML
    private ImageView imgImage4;
    @FXML
    private ImageView imgImage5;
    @FXML
    private ImageView imgImage6;
    @FXML
    private ImageView imgImage7;
    @FXML
    private ImageView imgImage8;
    @FXML
    private ImageView imgImage9;
    @FXML
    private ImageView imgImage10;

    @FXML
    private TextField tfPhone;
    @FXML
    public TextField tfName;
    @FXML
    public TextField tfChild;
    @FXML
    public TextField tfStreet;
    @FXML
    public TextField tfHouseNumber;
    @FXML
    public TextField tfPostalCode;
    @FXML
    public TextField tfCity;

    @FXML
    private PasswordField pfPassword;
    @FXML
    private Label allergene;

    @FXML
    private Button btResetSelection;
    @FXML
    private Button btToOrder;
    @FXML
    private RadioButton rbMonH1;
    @FXML
    private RadioButton rbMonH2;
    @FXML
    private RadioButton rbTueH1;
    @FXML
    private RadioButton rbTueH2;
    @FXML
    private RadioButton rbWednH1;
    @FXML
    private RadioButton rbWednH2;
    @FXML
    private RadioButton rbThurH1;
    @FXML
    private RadioButton rbThurH2;
    @FXML
    private RadioButton rbFriH1;
    @FXML
    private RadioButton rbFriH2;

    @FXML
    private ListView<String> orderList;


    @FXML
    final String imagePathUrl = "file:target/classes/com/example/vpr_javafx/pics/";
    @FXML
    final String veggieImageUrl = imagePathUrl + "vegetarisch.png";
    @FXML
    final String veganImageUrl = imagePathUrl + "vegan.png";
    @FXML
    final String meatImageUrl = imagePathUrl + "fleisch.png";
    @FXML
    private String imageUrl;

    private ArrayList<String> chosenMeals;

    @FXML
    protected void OnSignInButton(ActionEvent event) throws IOException
    {
        Data data = new Data("user.txt");
        data.validateData(tfPhone, pfPassword, this);
    }


    @FXML
    protected void FillLabels() {
        try {
            List<String> menu = Files.readAllLines(Paths.get("menue.txt"));

            for (int i = 0; i < menu.size(); i++)
            {

                String[] parts = menu.get(i).split(";");

                String dish = parts[1];
                String sideDish = parts[2];
                String typ = parts[3];
                String allergenic = parts[4];

                String dayMenu = dish+"\n"+sideDish+"\n"+"("+allergenic+")";

                if(typ.equals("Fleisch")) {
                    imageUrl=meatImageUrl;
                }
                if(typ.equals("Vegetarisch")) {
                    imageUrl=veggieImageUrl;
                }
                if(typ.equals("Vegan")) {
                    imageUrl=veganImageUrl;
                }

                Image image = new Image(imageUrl);

                switch (i) {
                    case 0:
                        lMonH1.setText(dayMenu);
                        imgImage1.setImage(image);
                        break;
                    case 1:
                        lMonD1.setText(dayMenu);
                        break;
                    case 2:
                        lMonH2.setText(dayMenu);
                        imgImage2.setImage(image);
                        break;
                    case 3:
                        lMonD2.setText(dayMenu);
                        break;
                    case 4:
                        lTueH1.setText(dayMenu);
                        imgImage3.setImage(image);
                        break;
                    case 5:
                        lTueD1.setText(dayMenu);
                        break;
                    case 6:
                        lTueH2.setText(dayMenu);
                        imgImage4.setImage(image);
                        break;
                    case 7:
                        lTueD2.setText(dayMenu);
                        break;
                    case 8:
                        lWednH1.setText(dayMenu);
                        imgImage5.setImage(image);
                        break;
                    case 9:
                        lWednD1.setText(dayMenu);
                        break;
                    case 10:
                        lWednH2.setText(dayMenu);
                        imgImage6.setImage(image);
                        break;
                    case 11:
                        lWednD2.setText(dayMenu);
                        break;
                    case 12:
                        lThurH1.setText(dayMenu);
                        imgImage7.setImage(image);
                        break;
                    case 13:
                        lThurD1.setText(dayMenu);
                        break;
                    case 14:
                        lThurH2.setText(dayMenu);
                        imgImage8.setImage(image);
                        break;
                    case 15:
                        lThurD2.setText(dayMenu);
                        break;
                    case 16:
                        lFriH1.setText(dayMenu);
                        imgImage9.setImage(image);
                        break;
                    case 17:
                        lFriD1.setText(dayMenu);
                        break;
                    case 18:
                        lFriH2.setText(dayMenu);
                        imgImage10.setImage(image);
                        break;
                    case 19:
                        lFriD2.setText(dayMenu);
                        break;
                }
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * writeAllergene() is a method to format and set allergene
     * @author Madeleine Vigier
     */
    @FXML
    protected void writeAllergene() {
        allergene.setText("a: Eier; b: Soja,\n"
                + "c: Milch; d: Erdnüsse;\n"
                + "e: Weichtiere; f: Krebstiere;\n"
                + "g: Getreide; h: Senf; i: Sesam;\n"
                + "j: Schwefeldioxid und Sulfit;\n"
                + "k: Nüsse; l: Sellerie;\n"
                + "m: Fische; n: Lupinen\n\n"
                + "1: Nitrit-Pökelsalz\n"
                + "2: Phosphat\n"
                + "3: Nitrat\n"
                + "4: Antioxidationsmittel\n"
                + "5: Farbstoff\n"
                + "6: Geschmacksverstärker;\n"
                + "7: Süßungsmittel;\n"
                + "8: Konservierungsstoff");
    }

    /**
     * ToRegistration() ruft die Registration-View auf, sobald man auf den Registrierungs-Button klickt
     * @param event
     * @throws IOException
     * @author Kevin Maier
     */
    @FXML
    protected void ToRegistration(ActionEvent event) throws IOException
    {
        Parent root = FXMLLoader.load(getClass().getResource("Registration-view.fxml"));
        Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    /**
     * OnRegistrationButton() creates a new user
     * @param event
     * @throws IOException
     * @author Kevin Maier
     */
    @FXML
    protected void OnRegistrationButton(ActionEvent event) throws IOException
    {
        Alert alert = new Alert(Alert.AlertType.WARNING);
        Data validRegistration = new Data("user.txt");

        if (validRegistration.validateRegistration(tfName, tfPhone, pfPassword, tfStreet, tfHouseNumber, tfPostalCode, tfCity, tfChild, this))
        {
            try (FileWriter writer = new FileWriter("user.txt", true)){
                writer.write(tfName.getText() + ";" + tfStreet.getText() + " " + tfHouseNumber.getText() + "," + tfPostalCode.getText() + " " + tfCity.getText() + ";" + tfPhone.getText() + ";" + tfChild.getText() + ";" + pfPassword.getText() + System.lineSeparator());

                Parent root = FXMLLoader.load(getClass().getResource("MenuOverview-view.fxml"));
                Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
                Scene scene = new Scene(root);
                stage.setScene(scene);
                stage.show();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    @FXML
    protected void setRadioButton()
    {
        ToggleGroup monToggle = new ToggleGroup();
        ToggleGroup tueToggle = new ToggleGroup();
        ToggleGroup wednToggle = new ToggleGroup();
        ToggleGroup thurToggle = new ToggleGroup();
        ToggleGroup friToggle = new ToggleGroup();

        rbMonH1.setToggleGroup(monToggle);
        rbMonH2.setToggleGroup(monToggle);
        rbTueH1.setToggleGroup(tueToggle);
        rbTueH2.setToggleGroup(tueToggle);
        rbWednH1.setToggleGroup(wednToggle);
        rbWednH2.setToggleGroup(wednToggle);
        rbThurH1.setToggleGroup(thurToggle);
        rbThurH2.setToggleGroup(thurToggle);
        rbFriH1.setToggleGroup(friToggle);
        rbFriH1.setToggleGroup(friToggle);

        btResetSelection.setVisible(true);
        btToOrder.setVisible(true);
        rbMonH1.setVisible(true);
        rbMonH2.setVisible(true);
        rbTueH1.setVisible(true);
        rbTueH2.setVisible(true);
        rbWednH1.setVisible(true);
        rbWednH2.setVisible(true);
        rbThurH1.setVisible(true);
        rbThurH2.setVisible(true);
        rbFriH1.setVisible(true);
        rbFriH2.setVisible(true);
    }

    @FXML
    protected void resetSelection(ActionEvent event)
    {
        rbMonH1.setSelected(false);
        rbMonH2.setSelected(false);
        rbTueH1.setSelected(false);
        rbTueH2.setSelected(false);
        rbWednH1.setSelected(false);
        rbWednH2.setSelected(false);
        rbThurH1.setSelected(false);
        rbThurH2.setSelected(false);
        rbFriH1.setSelected(false);
        rbFriH2.setSelected(false);
        chosenMeals.clear();
    }

    @FXML
    protected void toOrder(ActionEvent event) throws IOException
    {
        try (FileWriter writer = new FileWriter("parentOrder.txt", true))
        {
            writer.write(getLabelValueWithRadio().toString() + System.lineSeparator());
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setContentText("Bestellung abgeschickt.");

            Parent rootParent = FXMLLoader.load(getClass().getResource("Order-view.fxml"));
            Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
            Scene scene = new Scene(rootParent);
            stage.setScene(scene);
            stage.show();

            ObservableList<String> orders = FXCollections.observableArrayList(getLabelValueWithRadio());
            orderList = new ListView<>(orders);
            StackPane rootStackPane = new StackPane();
            rootStackPane.getChildren().add(orderList);
            Scene scene2 = new Scene(rootStackPane);
            stage.setScene(scene2);
            stage.show();

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    @FXML
    protected void removeFromOrder() throws IOException
    {

    }


    @FXML
    protected ArrayList<String> getLabelValueWithRadio()
    {
        chosenMeals = new ArrayList<>();
        String mainDish;
        String dessert;

        Data data = new Data("user.txt");
        for (User user : data.readUser())
        {
            if (tfPhone.getText().equals(user.getPhonenumber()) && pfPassword.getText().equals(user.getPassword()))
            {
                chosenMeals.add(user.toString());
                break;
            }
        }

        if (rbMonH1.isSelected())
        {
            mainDish = lMonH1.getText();
            dessert = lMonD1.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);

        }
        if (rbMonH2.isSelected())
        {
            mainDish = lMonH2.getText();
            dessert = lMonD2.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        if (rbTueH1.isSelected())
        {
            mainDish = lTueH1.getText();
            dessert = lTueD1.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        if (rbTueH2.isSelected())
        {
            mainDish = lTueH2.getText();
            dessert = lTueD2.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        if (rbWednH1.isSelected())
        {
            mainDish = lWednH1.getText();
            dessert = lWednD1.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        if (rbWednH2.isSelected())
        {
            mainDish = lWednH2.getText();
            dessert = lWednD2.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        if (rbThurH1.isSelected())
        {
            mainDish = lThurH1.getText();
            dessert = lThurD1.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        if (rbThurH2.isSelected())
        {
            mainDish = lThurH2.getText();
            dessert = lThurD2.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        if (rbFriH1.isSelected())
        {
            mainDish = lFriH1.getText();
            dessert = lFriD1.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        if (rbFriH2.isSelected())
        {
            mainDish = lFriH2.getText();
            dessert = lFriD2.getText();
            chosenMeals.add("Hauptgericht: " + mainDish + " Dessert: " + dessert);
        }
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setContentText(chosenMeals.toString());
        alert.show();

        return chosenMeals;
    }


}