package fi.lpam.gui;

import fi.lpam.dataluokat.Asiakas;
import fi.lpam.gui.elementit.MaaraTableColumn;
import fi.lpam.gui.elementit.TabPohja;
import javafx.collections.FXCollections;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;

import java.util.Objects;
import java.util.Optional;


@SuppressWarnings("unchecked")
public class Asiakashallinta extends TabPohja {
    final TableView<Asiakas> tvAsiakkaat = new TableView<>();

    public Asiakashallinta() {
        BorderPane root = new BorderPane();
        this.getChildren().add(root);
        root.setPadding(oletusInsets);

        BorderPane yläpalkki = new BorderPane();
        root.setTop(yläpalkki);
        Label otsikko = new Label("Asiakashallinta");
        otsikko.setFont(tekstiFont);
        yläpalkki.setLeft(otsikko);

        HBox yläpalkinNapit = new HBox();
        yläpalkinNapit.setSpacing(5);
        yläpalkki.setRight(yläpalkinNapit);

        Button poistaValittu = new Button("Poista");
        poistaValittu.setOnAction(_ -> poistaValittu());
        poistaValittu.setFont(TabPohja.buttonFont);
        yläpalkinNapit.getChildren().add(poistaValittu);

        Button muokkaaAsiakasta = new Button("Muokkaa");
        muokkaaAsiakasta.setOnAction(_ -> muokkaaValittua());
        muokkaaAsiakasta.setFont(TabPohja.buttonFont);
        yläpalkinNapit.getChildren().add(muokkaaAsiakasta);

        Button uusiAsiakas = new Button("Uusi asiakas");
        uusiAsiakas.setOnAction(_ -> uusiAsiakas());
        uusiAsiakas.setFont(TabPohja.buttonFont);
        yläpalkinNapit.getChildren().add(uusiAsiakas);

        tvAsiakkaat.setEditable(false);
        tvAsiakkaat.setPlaceholder(new Label("Ei vielä tietoja"));
        tvAsiakkaat.setOnMouseClicked((MouseEvent mouseEvent) -> {
            if (mouseEvent.getClickCount() == 2) {
                muokkaaValittua();
            }
        });
        tvAsiakkaat.setOnKeyPressed(e -> {
            if (tvAsiakkaat.getSelectionModel().getSelectedItem() != null) {
                if (e.getCode() == KeyCode.ENTER) {
                    muokkaaValittua();
                }
            }

        });
        root.setCenter(tvAsiakkaat);

        TableColumn<Asiakas, String> tcNimi = new TableColumn<>("Nimi");
        tcNimi.setMinWidth(180);
        tcNimi.setCellValueFactory(new PropertyValueFactory<>("nimi"));
        TableColumn<Asiakas, String> tcOsoite = new TableColumn<>("Osoite");
        tcOsoite.setMinWidth(250);
        tcOsoite.setCellValueFactory(new PropertyValueFactory<>("osoite"));

        TableColumn<Asiakas, MaaraTableColumn<Asiakas, Integer>> tcKuljetuspäivät = new TableColumn<>("Kuljetukset per päivä");
        MaaraTableColumn<Asiakas, Integer> tcMaanantaiKpl = new MaaraTableColumn<>("MA", 20);
        tcMaanantaiKpl.setCellValueFactory(new PropertyValueFactory<>("maanantaiKpl"));
        MaaraTableColumn<Asiakas, Integer> tcTiistaiKpl = new MaaraTableColumn<>("TI", 20);
        tcTiistaiKpl.setCellValueFactory(new PropertyValueFactory<>("tiistaiKpl"));
        MaaraTableColumn<Asiakas, Integer> tcKeskiviikkoKpl = new MaaraTableColumn<>("KE", 20);
        tcKeskiviikkoKpl.setCellValueFactory(new PropertyValueFactory<>("keskiviikkoKpl"));
        MaaraTableColumn<Asiakas, Integer> tcTorstaiKpl = new MaaraTableColumn<>("TO", 20);
        tcTorstaiKpl.setCellValueFactory(new PropertyValueFactory<>("torstaiKpl"));
        MaaraTableColumn<Asiakas, Integer> tcPerjantaiKpl = new MaaraTableColumn<>("PE", 20);
        tcPerjantaiKpl.setCellValueFactory(new PropertyValueFactory<>("perjantaiKpl"));
        tcKuljetuspäivät.getColumns().addAll(tcMaanantaiKpl, tcTiistaiKpl, tcKeskiviikkoKpl, tcTorstaiKpl, tcPerjantaiKpl);

        TableColumn<Asiakas, MaaraTableColumn<Asiakas, Integer>> tcKuljetusmäärät = new TableColumn<>("Määrät per kuljetus");
        MaaraTableColumn<Asiakas, Integer> tcSalaatit = new MaaraTableColumn<>("Salaatit", 90);
        tcSalaatit.setCellValueFactory(new PropertyValueFactory<>("salaatit"));
        MaaraTableColumn<Asiakas, Integer> tcPääruoat = new MaaraTableColumn<>("Pääruoat", 90);
        tcPääruoat.setCellValueFactory(new PropertyValueFactory<>("pääruoat"));
        MaaraTableColumn<Asiakas, Integer> tcJälkiruoat = new MaaraTableColumn<>("Jälkiruoat", 90);
        tcJälkiruoat.setCellValueFactory(new PropertyValueFactory<>("jälkiruoat"));
        tcKuljetusmäärät.getColumns().addAll(tcSalaatit, tcPääruoat, tcJälkiruoat);

        TableColumn<Asiakas, String> tcErityisruokavalio = new TableColumn<>("Ruokarajoitteet");
        tcErityisruokavalio.setMinWidth(150);
        tcErityisruokavalio.setCellValueFactory(new PropertyValueFactory<>("erityisruokavalio"));
        TableColumn<Asiakas, String> tcAvainTieto = new TableColumn<>("Avaintieto");
        tcAvainTieto.setMinWidth(150);
        tcAvainTieto.setCellValueFactory(new PropertyValueFactory<>("avainTieto"));
        TableColumn<Asiakas, String> tcLisätiedot = new TableColumn<>("Lisätieto kuljetukselle");
        tcLisätiedot.setMinWidth(250);
        tcLisätiedot.setCellValueFactory(new PropertyValueFactory<>("lisätiedot"));

        tvAsiakkaat.getColumns().addAll(tcNimi, tcOsoite, tcKuljetuspäivät, tcKuljetusmäärät, tcErityisruokavalio, tcAvainTieto, tcLisätiedot);
        for (TableColumn<Asiakas, ?> column : tvAsiakkaat.getColumns()) {
            column.setEditable(false);
            column.setReorderable(false);
            column.setResizable(false);
            column.setStyle("-fx-alignment: CENTER; -fx-font-size: 16px;");

        }

        tvAsiakkaat.setItems(FXCollections.observableArrayList(Objects.requireNonNull(Asiakas.haeKaikki())));
    }

    private void uusiAsiakas() {
        Asiakas luotavaAsiakas = new Asiakas();
        AsiakasIkkuna asiakasIkkuna = new AsiakasIkkuna(luotavaAsiakas);
        asiakasIkkuna.showAndWait();
        if (luotavaAsiakas.getId() != -1) {
            //Asiakas luotu ja id saatu tietokannasta
            tvAsiakkaat.getItems().add(luotavaAsiakas);
            tvAsiakkaat.refresh();
        }
    }

    private void muokkaaValittua() {
        Asiakas muokattavaAsiakas = tvAsiakkaat.getSelectionModel().getSelectedItem();
        if (muokattavaAsiakas == null) {return;}
        AsiakasIkkuna asiakasIkkuna = new AsiakasIkkuna(muokattavaAsiakas);
        asiakasIkkuna.showAndWait();
        tvAsiakkaat.refresh();
    }

    private void poistaValittu() {
        Asiakas valittuAsiakas = tvAsiakkaat.getSelectionModel().getSelectedItem();
        boolean läpi = false;
        if (valittuAsiakas != null) {
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setTitle("Oletko varma?");
            alert.setHeaderText("Poistetaanko valittu valittu asiakas?");
            alert.setContentText(valittuAsiakas.getNimi());
            Optional<ButtonType> result = alert.showAndWait();
            if (result.isPresent() && result.get() == ButtonType.OK) {
                läpi = valittuAsiakas.poista();
            }
            if (läpi) {
                tvAsiakkaat.getItems().remove(valittuAsiakas);
                tvAsiakkaat.refresh();
            }
        }
    }
}