/*
 * Open Source Software published under the Apache Licence, Version 2.0.
 */

package io.github.vocabhunter.gui.controller;

import io.github.vocabhunter.gui.model.MainModel;
import io.github.vocabhunter.gui.model.SessionModel;
import io.github.vocabhunter.gui.settings.SettingsManager;
import io.github.vocabhunter.gui.settings.WindowSettings;
import io.github.vocabhunter.gui.status.StatusManager;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

import javax.inject.Inject;
import javax.inject.Singleton;

@Singleton
public class ExitRequestHandler {
    private final GuiFileHandler guiFileHandler;

    private final SettingsManager settingsManager;

    private final StatusManager statusManager;

    private final MainModel model;

    private Stage stage;

    @Inject
    public ExitRequestHandler(final GuiFileHandler guiFileHandler, final SettingsManager settingsManager, final StatusManager statusManager, final MainModel model) {
        this.guiFileHandler = guiFileHandler;
        this.settingsManager = settingsManager;
        this.statusManager = statusManager;
        this.model = model;
    }

    public void initialise(final Stage stage) {
        this.stage = stage;
    }

    public void handleExitRequest(final WindowEvent e) {
        if (model.isLocaleDefined() && statusManager.beginExit()) {
            try {
                if (processCloseRequest(e)) {
                    statusManager.markSuccess();
                }
            } finally {
                statusManager.completeAction();
            }
        }
    }

    private boolean processCloseRequest(final WindowEvent e) {
        boolean isContinue = guiFileHandler.unsavedChangesCheck();

        if (isContinue) {
            WindowSettings windowSettings = new WindowSettings();

            windowSettings.setX(stage.getX());
            windowSettings.setY(stage.getY());
            windowSettings.setWidth(stage.getWidth());
            windowSettings.setHeight(stage.getHeight());
            model.getSessionModel().ifPresent(s -> saveSplitPositions(windowSettings, s));

            settingsManager.setWindowSettings(windowSettings);
        } else {
            e.consume();
        }

        return isContinue;
    }

    private void saveSplitPositions(final WindowSettings windowSettings, final SessionModel sessionModel) {
        windowSettings.setSplitUsePosition(sessionModel.getSplitUsePosition());
        windowSettings.setSplitWordPosition(sessionModel.getSplitWordPosition());
    }
}