package de.wwwu.awolf.view;


import de.wwwu.awolf.model.Line;
import de.wwwu.awolf.presenter.algorithms.Algorithm;
import de.wwwu.awolf.presenter.data.DataHandler;
import de.wwwu.awolf.presenter.util.Logging;
import de.wwwu.awolf.view.controller.AlgorithmTabController;
import de.wwwu.awolf.view.services.DataService;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.*;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
 *
 * @Author: Armin Wolf
 * @Email: a_wolf28@uni-muenster.de
 * @Date: 28.05.2017.
 */
public class ViewController {

    private static final String TITLE = "Beta JavaFX";
    private Parent pane;

    public TabPane tabPane;
    public MenuBar menuBar;
    public TextArea logArea;

    public ViewController() {
        super();
    }

    public void initGui() {
        initMenuBar();
        initTabbedPane();
    }

    private void initTabbedPane() {
        //TODO
        Map<String, String> props = new HashMap<>();
        props.put("sfsdf", "dsadasd");
        props.put("dfd", "dsadasd");
        props.put("sdfdsfg", "dsadasd");
        props.put("dsfsdfsdf", "dsadasd");



        try {
            for (Algorithm.Type value : Algorithm.Type.values()) {
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(AlgorithmTabController.class.getResource("/views/AlgorithmTab.fxml"));
                Parent parent = loader.load();
                AlgorithmTabController controller = loader.getController();
                controller.setAlgorithmType(value);
                controller.setProperties(props);
                controller.init();
                Tab tab = new Tab(value.getName(), parent);
                tab.setId(value.name());
                tabPane.getTabs().add(tab);
            }

        } catch (IOException e) {
            Logging.logError("Error while reading AlgorithmTab.fxml", e);
        }



    }

    private void initMenuBar() {
        // Create menus
        Menu fileMenu = new Menu("File");
        Menu toolsMenu = new Menu("Tools");
        Menu helpMenu = new Menu("Help");

        // Create MenuItems
        MenuItem exportItem = new MenuItem("Export");
        MenuItem importItem = new MenuItem("Import");
        MenuItem exitItem = new MenuItem("Exit");
        MenuItem aboutItem = new MenuItem("About");

        MenuItem generationItem = new MenuItem("Generate");
        generationItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                //TODO
                new DataService(DataHandler.DataType.LINE, 100).start();
            }
        });
        MenuItem evaluationItem = new MenuItem("Evaluate");

        // Add menuItems to the Menus
        fileMenu.getItems().addAll(importItem, exportItem, exitItem);
        toolsMenu.getItems().addAll(generationItem, evaluationItem);
        helpMenu.getItems().addAll(aboutItem);

        // Add Menus to the MenuBar
        menuBar.getMenus().addAll(fileMenu, toolsMenu, helpMenu);

    }


    /*******************************************************************************************************************
     *                                          visualisierungs methoden
     ******************************************************************************************************************/


    /**
     * Visualisiert das Ergebnis des LMS-Schätzers
     *
     * @param line Line
     */
    public void visualizeLMS(final Line line) {
//        plotLMS = new PlotPanel();
//        lmsPanel.setPlotPanel(plotLMS);
//        createPlot(line.getM(), line.getB(), plotLMS, lmsPanel, "LMS");
    }

    /**
     * Visualisiert das Ergebnis des RM-Schätzers
     *
     * @param line Line
     */
    public void visualizeRM(final Line line) {
//        plotRM = new PlotPanel();
//        rmPanel.setPlotPanel(plotRM);
//        createPlot(line.getM(), line.getB(), plotRM, rmPanel, "RM");
    }


    /**
     * Visualisiert das Ergebnis des TS-Schätzers
     *
     * @param line Line
     */
    public void visualizeTS(final Line line) {
//        plotTS = new PlotPanel();
//        tsPanel.setPlotPanel(plotTS);
//        createPlot(line.getM(), line.getB(), plotTS, tsPanel, "TS");
    }

    /**
     * Fügt der Evaluations-Tabelle eine Zeile mit Daten hinzu
     *
     * @param tableEntries Data of the Table
     */
    public void appendEvalResult(Map<Algorithm.Type, Map<String, String>> tableEntries) {

//        SwingUtilities.invokeLater(() -> {
//            evaluationPanel.addRow(tableEntries);
//            evaluationPanel.repaint();
//            evaluationPanel.revalidate();
//        });
    }

    /**
     * Fügt der Evaluations-Tabelle eine Zeile mit Daten hinzu
     *
     * @param res Daten der Spalte
     */
    public void appendEvalResults(Map<Algorithm.Type, Map<String, String>> res) {
        appendEvalResult(res);
    }


    /*******************************************************************************************************************
     *                                          init GUI
     ******************************************************************************************************************/
    /**
     * Komponenten werden in Container gesetzt
     */
    private void addComponents() {
//        toolBar.add(importButton);
//        toolBar.add(exportButton);
//        toolBar.add(generateButton);
//        toolBar.setFloatable(false);
//
//        setJMenuBar(menu.getMenuBar());
//        add(toolBar);
//
//        setupSplitPane();
//        setupTabbedPane();
//        ((JPanel) progressDialog.getContentPane()).setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
//
//        this.add(toolBar, BorderLayout.NORTH);
//        this.add(splitpane, BorderLayout.CENTER);
    }


    /**
     * Initialisierung der Komponenten
     */
    private void initializeComponents(Collection<Node> list) {

//        //panels
//        toolBar = new JToolBar();
//        lmsPanel = new LMSPanel();
//        rmPanel = new RMPanel();
//        tsPanel = new TSPanel();
//        menu = new MenuBar();
//
//        //Dialogs
//        progressDialog = new JDialog();
//        progressDialog.setLocationRelativeTo(null);
//        progressContent = progressDialog.getContentPane();
//        progressBar = new JProgressBar();
//
//        //Panes
//        tabbedPane = new JTabbedPane();
//        output = new InfoPanel();
//        splitpane = new JSplitPane();
//
//        //Buttons
//        importButton = new JButton();
//        generateButton = new JButton();
//        exportButton = new JButton();

    }

    /**
     * Icons werden passend gesetzt
     */
    private void setIcons() {
//        try {
//            ClassLoader classLoader = getClass().getClassLoader();
//            Image imgImport = ImageIO.read(classLoader.getResource("import.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
//            Image imgStart = ImageIO.read(classLoader.getResource("start.png")).getScaledInstance(32, 32, Image.SCALE_SMOOTH);
//            Image imgGenerate = ImageIO.read(classLoader.getResource("generate.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
//            Image imgExport = ImageIO.read(classLoader.getResource("export.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
//            Image imgFrame = ImageIO.read(classLoader.getResource("frame.png")).getScaledInstance(32, 23, Image.SCALE_SMOOTH);
//
//            importButton.setIcon(new ImageIcon(imgImport));
//            exportButton.setIcon(new ImageIcon(imgExport));
//            generateButton.setIcon(new ImageIcon(imgGenerate));
//            lmsPanel.getStartButton().setIcon(new ImageIcon(imgStart));
//            rmPanel.getStartButton().setIcon(new ImageIcon(imgStart));
//            tsPanel.getStartButton().setIcon(new ImageIcon(imgStart));
//            this.setIconImage(imgFrame);
//        } catch (IOException e) {
//            Logging.logError(e.getMessage(), e);
//        }
    }

    /**
     * Funktionalitäten werden hinzugefügt
     */
    public void setActionListeners() {
//        //action listener für MenuItems
//        menu.addActionListeners();
//
//        //action listener für diese Klasse
//        lmsPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), lmsPanel));
//        rmPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), rmPanel));
//        tsPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), tsPanel));
//        importButton.addActionListener(new ImportDataListener((Presenter) this.getPresenter()));
//        exportButton.addActionListener(new ExportDataListener((Presenter) this.getPresenter()));
//        generateButton.addActionListener(new GenerateDataListener((Presenter) this.getPresenter()));

    }

    /**
     * Funktionalitäten werden aktiviert.
     */
    public void enableFunctionality() {
//        this.getLmsPanel().getStartButton().setEnabled(true);
//        this.getRmPanel().getStartButton().setEnabled(true);
//        this.getTsPanel().getStartButton().setEnabled(true);
//        this.getExportButton().setEnabled(true);
    }

    /**
     * Funktionalitäten werden deaktiviert.
     */
    public void disableFunctionality() {
//        this.getLmsPanel().getStartButton().setEnabled(false);
//        this.getRmPanel().getStartButton().setEnabled(false);
//        this.getTsPanel().getStartButton().setEnabled(false);
//        this.getExportButton().setEnabled(false);
    }

    /*******************************************************************************************************************
     *                                          log Methode
     ******************************************************************************************************************/
    /**
     * @param s Text der ausgegeben wird
     */
    public void logInfo(String s) {
        Platform.runLater(() -> {
            logArea.appendText(s + "\n");
        });
    }

    /**
     * @param s Fehlertext der ausgegeben wird
     */
    public void logError(String s) {
        Platform.runLater(() -> {
            logArea.appendText(s + "\n");
        });
    }

    /**
     * @param s Text der in grüner Farbe ausgegeben wird
     */
    public void logWarning(String s) {
        Platform.runLater(() -> {
            logArea.appendText(s + "\n");
        });
    }


    /*******************************************************************************************************************
     *                                          Getter und Setter Methoden
     ******************************************************************************************************************/
}
