package de.subway_surfers.vpr_app;

import Logik.Mahlzeit;
import Logik.Tagesplan;
import RestAPISchnittstelle.RestApiClient;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.stage.Modality;
import javafx.stage.Stage;

import java.net.http.WebSocket;
import java.text.DateFormat;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;

import static java.time.LocalTime.now;


public class EssensverwaltungMitarbeiterView {

	public Label dateLabel;
	@FXML
	private GridPane tagesplan;

	private Tagesplan t;

	private String date;

	/**
	 * Initialize des Controllers.
	 * Setzt das Datum, holt die Gerichte ein und initialisiert die responsive grid.
	 * @author Samuel Wolff
	 */
	public void initialize(){

		date = LocalDate.now().toString();

		dateLabel.setText(date);

		initGrid();
		initGerichte();

	}

	/**
	 * Methode beim klicken auf den Anmeldebutton. Meldet den User ab
	 * @param actionEvent
	 * @author Max Heer
	 */
	public void onAbmelden(ActionEvent actionEvent) {
		VerwaltungApplication.sceneWechseln("login-view.fxml");
	}

	/**
	 * Methode beim klicken auf den Filter Button. Öffnet den Filter Dialog.
	 * @param actionEvent
	 * @author Sven Alteköster
	 */
	public void onFilter(ActionEvent actionEvent) {
		Stage stage = new Stage();
		VerwaltungApplication.sceneWechseln(stage, 450, 400, "inhaltsstoffe_filtern-view.fxml");

	}

	/**
	 * Methode beim klicken auf den hinzufügen Button. Öffnet den Dialog zum hinzufügen eines Gerichtes zum aktuellen Tag.
	 * @param actionEvent
	 * @author Sven Alteköster
	 */
	public void onHinzufuegen(ActionEvent actionEvent) {
		Stage gerichterstellung = new Stage();

		//solange das neu geöffnete Fenster offen ist, wird das Hauptfenster gesperrt
		gerichterstellung.initModality(Modality.APPLICATION_MODAL);

		VerwaltungApplication.sceneWechseln(gerichterstellung, 500, 700, "gerichterstellung_mitarbeiter-view.fxml");

		gerichterstellung.minWidthProperty().set(500);
		gerichterstellung.minHeightProperty().set(700);
	}

	/**
	 * Methode beim klicken auf den Zurück Button. Kehrt zum Startbildschirm zurück.
	 * @param actionEvent
	 * @author Max Heer
	 */
	public void onZurueck(ActionEvent actionEvent) {
		VerwaltungApplication.sceneWechseln("hauptmenue_mitarbeiter-view.fxml");
	}

	/**
	 * Methode bei Klick auf Pfeil links, ändert das Datum und gibt neue Gerichte auf die GUI aus.
	 * @param actionEvent
	 * @author Samuel Wolff
	 */
	public void pfeilLinks(ActionEvent actionEvent) {

		tagesplan.getChildren().clear();

		LocalDate datum = LocalDate.parse(date);
		datum = datum.minusDays(1);
		date = datum.toString();
		dateLabel.setText(date);

		initGerichte();

	}

	/**
	 * Methode bei Klick auf Pfeil rechts, ändert das Datum und gibt neue Gerichte auf die GUI aus.
	 * @param actionEvent
	 * @author Samuel Wolff
	 */
	public void pfeilRechts(ActionEvent actionEvent) {

		tagesplan.getChildren().clear();

		LocalDate datum = LocalDate.parse(date);
		datum = datum.plusDays(1);
		date = datum.toString();
		dateLabel.setText(date);

		initGerichte();

	}

	/**
	 * Initialisiert alle Gerichte des aktuellen Datums auf der Seite.
	 * @author Samuel Wolff
	 */
	private void initGerichte(){

		tagesplan.getStyleClass().clear();
		tagesplan.getChildren().clear();

		t = new RestApiClient().getGerichteOnTag(date);

		if(!t.getGerichte().isEmpty()) {
			for (int i = 0; i < t.getGerichte().size(); i++) {
				Label name = new Label();
				tagesplan.add(name, i, 0);
				Label beschreibung = new Label();
				beschreibung.setWrapText(true);
				tagesplan.add(beschreibung, i, 1);
				Button loeschen = new Button("Löschen");
				tagesplan.add(loeschen, i ,2);
				loeschen.setOnAction(this::loeschenButtonKlick);

				name.setText(t.getGerichte().get(i).getName());
				beschreibung.setText(t.getGerichte().get(i).getBeschreibung());
			}
		}
		else {
			Label label = new Label();

			label.setText("Für diesen Tag sind keine Gerichte eingetragen");
			tagesplan.add(label, 0, 0);
		}

		for (Node n : tagesplan.getChildren()) {
			if (n instanceof Control) {
				((Control) n).setPrefWidth(tagesplan.getWidth() / tagesplan.getColumnCount());
			}
		}

		for (Node n : tagesplan.getChildren()){
			if(n instanceof Control  && GridPane.getRowIndex(n) == 1){
				((Control) n).setPrefHeight(tagesplan.getHeight());
			}
		}

		tagesplan.getStyleClass().add("essensuebersicht_gridlines");
	}

	/**
	 * Initialisiert das responsive grid.
	 * @author Max Heer, Sven Alteköster
	 */
	public void initGrid(){
		for (int i = 0; i < tagesplan.getColumnCount(); i++) {
			ColumnConstraints cc = new ColumnConstraints();
			cc.setHgrow(Priority.ALWAYS);
			cc.setFillWidth(true);
			tagesplan.getColumnConstraints().add(cc);
		}

		tagesplan.heightProperty().addListener((obs,oldValue,newValue) -> {
			final int zeile = 1;
			for (Node n : tagesplan.getChildren()){
				if(n instanceof Control  && GridPane.getRowIndex(n) == zeile){
					((Control) n).setPrefHeight(newValue.floatValue());
				}
			}
		});

		VerwaltungApplication.responsiveBreiteGrid(tagesplan);
	}

	/**
	 * Methode beim klicken auf den Löschen Button eines Tagesplan Elementes
	 * @param a
	 * @author Samuel Wolff
	 */
	private void loeschenButtonKlick(ActionEvent a){
		Button btn = (Button) a.getSource();
		int col = GridPane.getColumnIndex(btn);
		Mahlzeit m = t.getGerichte().get(col);

		RestApiClient cl = new RestApiClient();

		int id = cl.getGerichtIdOnTag(t.getGerichte().get(col < 0 ? 0 : col).getName().replace(' ', '_'), date);

		t.getGerichte().remove(col);

		System.out.println("Die Id lautet: " + id + col);

		cl.delete("GibtsAm", id);
		initGerichte();
	}



}
