import imp.*;  				// Alles aus IMP Unterordner
import javafx.fxml.*;  		// FXML Definitionen 
import javafx.scene.control.*;  // Jedes Control-Element
import javafx.scene.layout.*;  	// Alle Layout-Definitionen
import javafx.event.*; 		// Button und Menu-Events
import javafx.stage.*;	        // Dateiöffnen / Speichern-Dialog
import java.io.File;  		// Dateihandling
import javafx.scene.control.Alert.AlertType;

public class Controller {

    @FXML
    private HBox hauptbereich;

    @FXML
    private PictureViewer viewer;

    @FXML
    private Slider slZoom;

    @FXML
    private Label lDateiname;

    // Eigene Attribute
    private FileChooser dateidialog;
    private GeometrischeBildoperationen algo1;
    private Punktoperationen algo2;
    private Mehrpixeloperationen algo3;


    public void initialize() {
        dateidialog = new FileChooser();
        dateidialog.setInitialDirectory(new File("images"));

        algo1 = new GeometrischeBildoperationen();
        algo2 = new Punktoperationen();
        algo3 = new Mehrpixeloperationen();

        slZoom.valueProperty().addListener((observable, oldValue, newValue) -> zoom());
    }

    void zoom() {
        // Auslesen von Control-Elementen  
        double zoom = slZoom.getValue();

        // Control-Elemente anpassen
        viewer.setZoom(zoom);
    }

    @FXML
    void bZurueck(ActionEvent event) {
        viewer.back();
    }

    @FXML
    void mBeenden(ActionEvent event) {
        // Frage nach Fenster und schließe dieses
        Stage stage = (Stage) hauptbereich.getScene().getWindow();
        stage.close();
    }

    @FXML
    void mBildOeffnen(ActionEvent event) {
        File file = dateidialog.showOpenDialog(null);
        if (file != null) {
            Picture neuesBild = new Picture(file.getAbsolutePath());
            viewer.setImage(neuesBild, true);
            lDateiname.setText(file.getAbsolutePath());
        }
    }

    @FXML
    void mBildSpeichern(ActionEvent event) {
        File file = dateidialog.showSaveDialog(null);
        if (file != null) {
            Picture aktuellesBild = viewer.getImage();
            aktuellesBild.save(file.getAbsolutePath());
            lDateiname.setText(file.getAbsolutePath());
        }
    }

    @FXML
    void mDreheLinks(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo1.dreheLinks(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mDreheRechts(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo1.dreheRechts(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mFindeHorizontaleKanten(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo3.kantenfindenHorizontal(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mFindeKanten(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo3.kantenfinden(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mFindeVertikaleKanten(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo3.kantenfindenVertikal(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mGraustufenMaximum(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.graustufenMax(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mGraustufenMinimum(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.graustufenMin(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mGraustufenMittelwert(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.graustufenDurchschnitt(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mGraustufenNatuerlich(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.graustufenNatuerlich(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mNurBlaukanal(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.farbaenderung(aktuellesBild,0.0,0.0,1.0);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mNurGruenkanal(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.farbaenderung(aktuellesBild,0.0,1.0,0.0);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mNurRotkanal(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.farbaenderung(aktuellesBild,1.0,0.0,0.0);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mRelief(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo3.relief(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mSchaerfen(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo3.schaerfen(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern

    }

    @FXML
    void mSpiegleHorizontal(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo1.spiegelHorizontal(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mSpiegleVertikal(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo1.spiegelVertikal(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mTauschGruenBlau(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.tauschGruenBlau(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mTauschRotBlau(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.tauschRotBlau(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mTauschRotGruen(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo2.tauschRotGruen(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern
    }

    @FXML
    void mUeber(ActionEvent event) {
        Alert alert = new Alert(AlertType.INFORMATION);
        alert.setTitle("Über mein Programm ...");
        alert.setHeaderText(null);
        alert.setContentText("Dieses Programm wurde erstellt von :\nThomas Schaller (ZPG IMP)\nVersion 1.0, Januar 2020");

        alert.showAndWait();
    }

    @FXML
    void mWeichzeichnen(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo3.weichzeichnen(aktuellesBild);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern

    }

    @FXML
    void mWeichzeichnen31x31(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo3.weichzeichnen(aktuellesBild,31);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern

    }

    @FXML
    void mWeichzeichnenGauss31x31(ActionEvent event) {
        // Auslesen von Control-Elementen
        Picture aktuellesBild = viewer.getImage(); 
        // Berechnung durchführen
        Picture neuesBild = algo3.gaussfilter(aktuellesBild,31);
        // Control-Elemente anpassen
        viewer.setImage(neuesBild, true);  // true = altes Bild speichern

    }

    @FXML
    void mZurueck(ActionEvent event) {
        viewer.back();
    }



}
