package com.valkryst.Schillsaver.mvc.view;

import com.valkryst.Schillsaver.mvc.JFXHelper;
import com.valkryst.Schillsaver.mvc.model.Model;
import com.valkryst.VIcons.VIconType;
import javafx.application.Platform;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import lombok.Getter;
import lombok.NonNull;

public class MainView extends View {
    @Getter private Button button_createJob;
    @Getter private Button button_editJob;
    @Getter private Button button_deleteSelectedJobs;
    @Getter private Button button_processJobs;

    @Getter private ListView<String> jobsList;
    @Getter private TabPane outputPanes;

    @Getter private Button button_programSettings;

    private final SplitPane contentArea;

    /**
     * Constructs a new MainView.
     *
     * @param model
     *          The model.
     */
    public MainView(final Model model) {
        initializeComponents();
        setComponentTooltips();

        final Pane menuBar = createMenuBar();
        contentArea = createContentArea();

        super.setPane(new VBox(menuBar, contentArea));
        super.getPane().setMinSize(512, 512);
    }

    /** Initializes the components. */
    private void initializeComponents() {
        button_createJob = JFXHelper.createIconButton(VIconType.FILE_NEW.getFilePath(), 32, 32);
        button_editJob = JFXHelper.createIconButton(VIconType.FILE_EDIT.getFilePath(), 32, 32);
        button_deleteSelectedJobs = JFXHelper.createIconButton(VIconType.FILE_DELETE.getFilePath(), 32, 32);
        button_processJobs = JFXHelper.createIconButton(VIconType.FILE_PROCESS.getFilePath(), 32, 32);

        jobsList = new ListView<>();
        jobsList.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        outputPanes = new TabPane();

        button_programSettings = JFXHelper.createIconButton(VIconType.SETTINGS.getFilePath(), 32, 32);
    }

    /** Sets the tooltips of the components. */
    private void setComponentTooltips() {
        JFXHelper.setTooltip(button_createJob, "Create a new job.");
        JFXHelper.setTooltip(button_editJob, "Edit the selected job.");
        JFXHelper.setTooltip(button_deleteSelectedJobs, "Delete all selected jobs.");
        JFXHelper.setTooltip(button_processJobs, "Process jobs.");

        JFXHelper.setTooltip(button_programSettings, "Edit the program setting.");
    }

    /**
     * Creates the menu bar panel.
     *
     * @return
     *         The menu bar panel.
     */
    private Pane createMenuBar() {
        final HBox pane = new HBox(button_createJob, button_editJob, button_deleteSelectedJobs, button_processJobs, button_programSettings);

        HBox.setHgrow(pane, Priority.ALWAYS);
        VBox.setVgrow(pane, Priority.NEVER);

        HBox.setHgrow(button_createJob, Priority.ALWAYS);
        HBox.setHgrow(button_editJob, Priority.ALWAYS);
        HBox.setHgrow(button_deleteSelectedJobs, Priority.ALWAYS);
        HBox.setHgrow(button_processJobs, Priority.ALWAYS);
        HBox.setHgrow(button_programSettings, Priority.ALWAYS);

        return pane;
    }

    /**
     * Creates the content area panel.
     *
     * @return
     *         The content area panel.
     */
    private SplitPane createContentArea() {
        final SplitPane contentArea = new SplitPane(jobsList);

        HBox.setHgrow(contentArea, Priority.ALWAYS);
        VBox.setVgrow(contentArea, Priority.ALWAYS);

        jobsList.setFocusTraversable(false);

        return contentArea;
    }

    /**
     * Creates and adds a new output tab to the set of output tabs.
     *
     * @param title
     *          The title of the tab.
     *
     * @return
     *          The tab.
     *
     * @throws NullPointerException
     *         If the title is null.
     */
    public Tab addOutputTab(final @NonNull String title) {
        // Create Text Area for Output
        final var textArea = new TextArea();
        textArea.setEditable(false);
        textArea.setFocusTraversable(false);

        HBox.setHgrow(textArea, Priority.ALWAYS);
        VBox.setVgrow(textArea, Priority.ALWAYS);

        // Add Output Tab View If Necessary
        Platform.runLater(() -> {
            if (outputPanes.getTabs().size() == 0) {
                contentArea.getItems().add(outputPanes);
            }
        });

        // Create Tab
        final Tab tab = new Tab(title, textArea);
        tab.setOnClosed(e -> Platform.runLater(() -> {
            if (outputPanes.getTabs().size() == 0) {
                contentArea.getItems().remove(outputPanes);
            }
        }));

        Platform.runLater(() -> outputPanes.getTabs().add(tab));
        return tab;
    }
}