package fi.lpam.gui;

import fi.lpam.dataluokat.Asiakas;

import fi.lpam.gui.elementit.IntegerSpinner;
import fi.lpam.gui.elementit.TabPohja;
import fi.lpam.Main;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

import java.util.Objects;


public class AsiakasIkkuna extends Stage {
    final Asiakas käsiteltäväAsiakas;
    final TextField tfNimi, tfOsoite, tfRuokarajoitteet, tfAvainTieto, tfLisätiedot;
    final IntegerSpinner tfMaanantai, tfTiistai, tfKeskiviikko, tfTorstai, tfPerjantai, tfSalaatit, tfPääruoat, tfJälkiruoat;

    /**
     * Luo ikkunan jossa muokataan saatua asiakasta
     * @param käsiteltäväAsiakas voi olla uusi, tai vanha. Ikkuna ei välitä
     */
    public AsiakasIkkuna(Asiakas käsiteltäväAsiakas) {
        this.käsiteltäväAsiakas = käsiteltäväAsiakas;
        this.setTitle("Asiakasikkuna");

        GridPane root = new GridPane();
        root.setPadding(new Insets(15));
        root.setHgap(10);
        root.setVgap(10);
        root.setOnKeyPressed(e -> {
            switch (e.getCode()) {
                case ENTER: tallenna(); break;
                case ESCAPE: close(); break;
                default: break;
            }});

        root.addRow(root.getRowCount(), new Label("Vahvistetut kentät pakollisia"));

        Label nimi = new Label("Asiakkaan etu- ja sukunimi");
        nimi.setStyle("-fx-font-weight: bold;");
        tfNimi = new TextField();
        tfNimi.setPromptText("Pakollinen tieto");
        root.addRow(root.getRowCount(), nimi, tfNimi);

        Label osoite = new Label("Osoite");
        osoite.setStyle("-fx-font-weight: bold;");
        tfOsoite = new TextField();
        tfOsoite.setPromptText("Pakollinen tieto");
        root.addRow(root.getRowCount(), osoite, tfOsoite);

        root.addRow(root.getRowCount(), new Label("Määrät per kuljetus"));

        Label salaatit = new Label("Salaatit");
        tfSalaatit = new IntegerSpinner();
        root.addRow(root.getRowCount(), salaatit, tfSalaatit);

        Label pääruoat = new Label("Pääruoat");
        tfPääruoat = new IntegerSpinner();
        root.addRow(root.getRowCount(), pääruoat, tfPääruoat);

        Label jälkiruoat = new Label("Jälkiruoat");
        tfJälkiruoat = new IntegerSpinner();
        root.addRow(root.getRowCount(), jälkiruoat, tfJälkiruoat);

        root.addRow(root.getRowCount(), new Label("Kuljetukset per päivä"));

        Label maanantai = new Label("Maanantai");
        tfMaanantai = new IntegerSpinner();
        root.addRow(root.getRowCount(), maanantai, tfMaanantai);

        Label tiistai = new Label("Tiistai");
        tfTiistai = new IntegerSpinner();
        root.addRow(root.getRowCount(), tiistai, tfTiistai);

        Label keskiviikko = new Label("Keskiviikko");
        tfKeskiviikko = new IntegerSpinner();
        root.addRow(root.getRowCount(), keskiviikko, tfKeskiviikko);

        Label torstai = new Label("Torstai");
        tfTorstai = new IntegerSpinner();
        root.addRow(root.getRowCount(), torstai, tfTorstai);

        Label perjantai = new Label("Perjantai");
        tfPerjantai = new IntegerSpinner();
        root.addRow(root.getRowCount(), perjantai, tfPerjantai);

        Label ruokarajoitteet = new Label("Ruokarajoitteet");
        tfRuokarajoitteet = new TextField();
        root.addRow(root.getRowCount(), ruokarajoitteet, tfRuokarajoitteet);

        Label avainTieto = new Label("Avaintieto");
        tfAvainTieto = new TextField();
        root.addRow(root.getRowCount(), avainTieto, tfAvainTieto);

        Label lisätiedot = new Label("Kuljetuksen lisätiedot");
        tfLisätiedot = new TextField();
        tfLisätiedot.setPromptText("Näkyy raporteilla");
        root.addRow(root.getRowCount(), lisätiedot, tfLisätiedot);

        Button peruuta = new Button("Peruuta");
        peruuta.setFont(TabPohja.buttonFont);
        peruuta.setMinWidth(160);
        peruuta.setOnAction(_ -> this.close());
        Button tallenna = new Button("Tallenna");
        tallenna.setFont(TabPohja.buttonFont);
        tallenna.setMinWidth(160);
        tallenna.setOnAction(_ -> tallenna());
        root.addRow(root.getRowCount(), peruuta, tallenna);


        this.setScene(new Scene(root));
        this.getIcons().add(new Image(Objects.requireNonNull(Main.class.getResourceAsStream("kuljetusruokalaatikko.jpg"))));
        this.setAlwaysOnTop(true);
        this.setResizable(false);

        //Saatu asiakas on tullut muokattavaksi
        if (käsiteltäväAsiakas.getId() > 0) {
            näytäAsiakas();
        }
    }

    /**
     * Jos saadulla asiakkaalla on id (eli asiakas löytyy tietokannasta ja sillä on tietoja)
     * tällä funktiolla täytetään asiakkaan tiedot ikkunan kenttiin
     */
    private void näytäAsiakas() {
        tfNimi.setText(käsiteltäväAsiakas.getNimi());
        tfOsoite.setText(käsiteltäväAsiakas.getOsoite());
        tfMaanantai.getValueFactory().setValue(käsiteltäväAsiakas.getMaanantaiKpl());
        tfTiistai.getValueFactory().setValue(käsiteltäväAsiakas.getTiistaiKpl());
        tfKeskiviikko.getValueFactory().setValue(käsiteltäväAsiakas.getKeskiviikkoKpl());
        tfTorstai.getValueFactory().setValue(käsiteltäväAsiakas.getTorstaiKpl());
        tfPerjantai.getValueFactory().setValue(käsiteltäväAsiakas.getPerjantaiKpl());
        tfSalaatit.getValueFactory().setValue(käsiteltäväAsiakas.getSalaatit());
        tfPääruoat.getValueFactory().setValue(käsiteltäväAsiakas.getPääruoat());
        tfJälkiruoat.getValueFactory().setValue(käsiteltäväAsiakas.getJälkiruoat());
        tfRuokarajoitteet.setText(käsiteltäväAsiakas.getErityisruokavalio());
        tfAvainTieto.setText(käsiteltäväAsiakas.getAvainTieto());
        tfLisätiedot.setText(käsiteltäväAsiakas.getLisätiedot());
    }

    private void tallenna() {
        this.setAlwaysOnTop(false);
        String nimi = tfNimi.getText();
        String osoite = tfOsoite.getText();

        if (nimi.isEmpty() || osoite.isEmpty()) {
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("Tarkista tiedot");
            alert.setHeaderText(null);
            alert.setContentText("Nimi tai osoite ei voi olla tyhjiä");
            alert.showAndWait();
            return;
        }

        käsiteltäväAsiakas.setNimi(nimi);
        käsiteltäväAsiakas.setOsoite(osoite);
        käsiteltäväAsiakas.setMaanantaiKpl(tfMaanantai.getValue());
        käsiteltäväAsiakas.setTiistaiKpl(tfTiistai.getValue());
        käsiteltäväAsiakas.setKeskiviikkoKpl(tfKeskiviikko.getValue());
        käsiteltäväAsiakas.setTorstaiKpl(tfTorstai.getValue());
        käsiteltäväAsiakas.setPerjantaiKpl(tfPerjantai.getValue());
        käsiteltäväAsiakas.setSalaatit(tfSalaatit.getValue());
        käsiteltäväAsiakas.setPääruoat(tfPääruoat.getValue());
        käsiteltäväAsiakas.setJälkiruoat(tfJälkiruoat.getValue());
        käsiteltäväAsiakas.setErityisruokavalio(tfRuokarajoitteet.getText());
        käsiteltäväAsiakas.setAvainTieto(tfAvainTieto.getText());
        käsiteltäväAsiakas.setLisätiedot(tfLisätiedot.getText());

        boolean läpi = false;
        int maxYritykset = 3;
        int yritykset = 0;
        while (!läpi) {
            if (käsiteltäväAsiakas.getId() > 0) {
                läpi = käsiteltäväAsiakas.päivitäTietokantaan();
            }
            else {
                läpi = käsiteltäväAsiakas.tallennaUusi();
            }
            yritykset++;
            if (yritykset > maxYritykset) {
                break;
            }
        }


        if (läpi) {
            int viikonKuljetukset = käsiteltäväAsiakas.getMaanantaiKpl() + käsiteltäväAsiakas.getTiistaiKpl() + käsiteltäväAsiakas.getKeskiviikkoKpl() + käsiteltäväAsiakas.getTorstaiKpl() + käsiteltäväAsiakas.getPerjantaiKpl();
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("Onnistuimme!");
            alert.setHeaderText("Asiakkaan tallentaminen onnistui!");
            alert.setContentText(String.format("%s saa jatkossa yhteensä \n%s salaattia, %s pääruokaa ja %s jälkiruokaa viikossa",
                    käsiteltäväAsiakas.getNimi(), käsiteltäväAsiakas.getSalaatit()*viikonKuljetukset, käsiteltäväAsiakas.getPääruoat()*viikonKuljetukset, käsiteltäväAsiakas.getPääruoat()*viikonKuljetukset));
            alert.showAndWait();
            this.close();
        }
        this.setAlwaysOnTop(true);
    }
}