package fi.lpam.gui;

import com.dlsc.gemsfx.MultiColumnListView;

import fi.lpam.dataluokat.Asiakas;
import fi.lpam.dataluokat.Kierros;
import fi.lpam.gui.elementit.AsiakasListCell;
import fi.lpam.gui.elementit.TabPohja;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Objects;

public class Kierroshallinta extends TabPohja {
    private final MultiColumnListView<Asiakas> mclv = new MultiColumnListView<>();
    private final ArrayList<Kierros> kierrokset = Kierros.haeKaikki();
    private final ArrayList<Asiakas> kaikkiAsiakkaat = Asiakas.haeKaikki();

    public Kierroshallinta() {
        BorderPane root = new BorderPane();
        this.getChildren().add(root);
        root.setPadding(oletusInsets);
        root.setCenter(mclv);

        mclv.setCellFactory(_ -> new AsiakasListCell(mclv));
        mclv.setPlaceholderFrom(new Asiakas(""));
        mclv.setPlaceholderTo(new Asiakas(""));
        rakennaSarakkeet();

        BorderPane yläpalkki = new BorderPane();
        root.setTop(yläpalkki);

        Label infoTeksti = new Label("Siirrä asiakkaat haluamallesi kierrokselle. Kierroksia voit lisätä painamalla lisää kierros painiketta.\nTyhjät kierrokset poistuvat kierroksia tallentaessa.");
        infoTeksti.setFont(tekstiFont);
        yläpalkki.setLeft(infoTeksti);

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

        Button lisääKierros = new Button("Lisää uusi kierros");
        lisääKierros.setOnAction(_ -> lisaaKierros());
        lisääKierros.setFont(TabPohja.buttonFont);
        yläpalkinNapit.getChildren().add(lisääKierros);

        Button tallenna = new Button("Tallenna kierrokset");
        tallenna.setFont(TabPohja.buttonFont);
        tallenna.setOnAction(_ ->tallennaKierrokset());
        yläpalkinNapit.getChildren().add(tallenna);




    }

    private void rakennaSarakkeet() {
        mclv.getColumns().clear();
        ObservableList<Asiakas> eiKierroksella = FXCollections.observableArrayList(new ArrayList<>());
        HashSet<Integer> kierroksellaOlevatAsiakasIDt = new HashSet<>();

        if (!kierrokset.isEmpty()) {
            for (Kierros k : kierrokset) {
                MultiColumnListView.ListViewColumn<Asiakas> sarake = new MultiColumnListView.ListViewColumn<>();
                sarake.setHeader(new Label("Kierros " + k.getKierrosNumero()));
                sarake.setItems(k.getAsiakkaat());
                for (Asiakas asiakas : k.getAsiakkaat()) {
                    kierroksellaOlevatAsiakasIDt.add(asiakas.getId());
                }
                mclv.getColumns().add(sarake);
            }
        }

        for (Asiakas k : Objects.requireNonNull(kaikkiAsiakkaat)) {
            if (!kierroksellaOlevatAsiakasIDt.contains(k.getId())) {
                eiKierroksella.add(k);
            }
        }
        MultiColumnListView.ListViewColumn<Asiakas> colEiKierroksella = new MultiColumnListView.ListViewColumn<>();
        colEiKierroksella.setHeader(new Label("Ei vielä kierroksella"));
        colEiKierroksella.setItems(FXCollections.observableArrayList(eiKierroksella));
        mclv.getColumns().add(colEiKierroksella);
    }

    private void lisaaKierros() {
        int uudenKierroksenNumero = mclv.getColumns().size();
        Kierros lisättäväKierros = new Kierros(uudenKierroksenNumero, FXCollections.observableArrayList(new ArrayList<>()));
        kierrokset.add(lisättäväKierros);
        MultiColumnListView.ListViewColumn<Asiakas> uusiSarake = new MultiColumnListView.ListViewColumn<>();
        uusiSarake.setHeader(new Label("Kierros " + uudenKierroksenNumero));
        uusiSarake.setItems(lisättäväKierros.getAsiakkaat());
        mclv.getColumns().add(uudenKierroksenNumero-1, uusiSarake);
    }

    private void tallennaKierrokset() {
        int kierrosNumero = 1;
        int index = 0;
        for (int i = 0; i < kierrokset.size();) {
            Kierros k = kierrokset.get(i);
            k.setAsiakkaat(mclv.getColumns().get(index).getItems());
            index++;

            if (k.getAsiakkaat().isEmpty()) {
                k.poista();
                kierrokset.remove(i);
                continue;
            }

            k.setKierrosNumero(kierrosNumero);
            kierrosNumero++;
            k.tallenna();
            i++;
        }
        rakennaSarakkeet();

        Alert info = new Alert(Alert.AlertType.INFORMATION);
        info.setTitle("Kierrokset tallennettu");
        info.setHeaderText("Kierrokset tallennettu onnistuneesti");
        info.setContentText(null);
        info.showAndWait();
    }
}