/**
 * Copyright (c) 2011-2018 by Andrew Mustun. All rights reserved.
 * 
 * This file is part of the QCAD project.
 *
 * QCAD is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * QCAD is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with QCAD.
 */

 
include("scripts/File/File.js");
include("scripts/File/AutoSave/AutoSave.js");

/**
 * This action handles all user interaction to save the current drawing. If the current
 * drawing has no file name (has never been saved before), action SaveAs is triggered
 * instead.
 */
function Save(guiAction) {
    File.call(this, guiAction);
}

Save.prototype = new File();
Save.includeBasePath = includeBasePath;

Save.prototype.beginEvent = function() {
    File.prototype.beginEvent.call(this);

    var fileName = this.getDocument().getFileName();
    var fileVersion = this.getDocument().getFileVersion();

    // not yet saved or
    // loaded a backup file or
    // save failed:
    // launch save as instead:
    if (fileName === "" || new QFileInfo(fileName).completeBaseName().startsWith("~") ||
        !this.save(fileName, fileVersion, false)) {

        include(Save.includeBasePath + "/../SaveAs/SaveAs.js");
        var saveAsAction = new SaveAs();
        this.getDocumentInterface().queueAction(saveAsAction);
        this.terminate();
        return;
    }
    this.terminate();
};

Save.prototype.save = function(fileName, fileVersion, overwriteWarning) {
    if (isNull(overwriteWarning)) {
        overwriteWarning = true;
    }

    var appWin = EAction.getMainWindow();
    var di = EAction.getDocumentInterface();
    var buttons, ret;

//    var editingWorkingSet = di.getDocument().isEditingWorkingSet();
//    if (editingWorkingSet) {
//        buttons = new QMessageBox.StandardButtons(QMessageBox.Yes, QMessageBox.Cancel);
//        ret = QMessageBox.warning(
//                    appWin,
//                    qsTr("Block editing in progress"),
//                    qsTr("A block is currently exploded and being edited. Please save the block before saving your drawing.") + " " +
//                    qsTr("Saving will save the block contents exploded.") + " " +
//                    qsTr("Save anyway?"), buttons);
//        if (ret===QMessageBox.Cancel) {
//            return true;
//        }
//    }

    fileVersion = isNull(fileVersion) ? "" : fileVersion;

    fileName = di.getCorrectedFileName(fileName, fileVersion);

    var saveAs = false;

    if (overwriteWarning) {
        if (new QFileInfo(fileName).exists()) {
            buttons = makeQMessageBoxStandardButtons(QMessageBox.Yes, QMessageBox.No);
            ret = QMessageBox.warning(
                        appWin,
                        qsTr("Overwrite File?"),
                        qsTr("The file \"%1\" already exists. Do you wish to overwrite it?").arg(fileName), buttons);
            if (ret!=QMessageBox.Yes) {
                saveAs = true;
            }
        }
    }

    var colorWarning = RSettings.getBoolValue("SaveAs/ColorWarning", true);
    var noFullColor = !File.isRecommendedVersion(fileVersion);

    if (!saveAs && noFullColor) {
        if (colorWarning) {
            // dxflib has no full color support:
            if (!fileVersion.contains("dxflib")) {
                buttons = makeQMessageBoxStandardButtons(QMessageBox.Yes, QMessageBox.No);
                ret = QMessageBox.warning(
                            appWin,
                            qsTr("File Format Version Not Recommended"),
                            qsTr("The file format version you are using is not recommended: \"%1\".").arg(fileVersion) + "\n"
                            + qsTr("Custom properties will not be saved.") + "\n"
                            + qsTr("All black entities and layers will be saved as white.") + "\n"
                            + qsTr("All custom colors will be adjusted to the nearest fixed color.") + " " + qsTr("Proceed?"), buttons);
                if (ret!=QMessageBox.Yes) {
                    saveAs = true;
                }
            }
        }
    }

    if (saveAs) {
        include("scripts/File/SaveAs/SaveAs.js");
        var saveAsAction = new SaveAs();
        this.getDocumentInterface().queueAction(saveAsAction);
        this.terminate();
        return true;
    }

    appWin.setProgressText(qsTr("Saving..."));

    if (noFullColor) {
        EAction.handleUserWarning(qsTr("Saving to file format version \"%1\".").arg(fileVersion));
        EAction.handleUserWarning(qsTr("Black entities and layers are saved as white."));
        EAction.handleUserWarning(qsTr("Custom colors are adjusted to the nearest fixed color."));
    }

    var bakFileName = AutoSave.getAutoSaveFileNameCurrent();

    if (!di.exportFile(fileName, fileVersion)) {
        var text = qsTr("File %1 has not been saved.").arg(fileName);
        appWin.handleUserWarning(text, true);
        appWin.setProgressText();
        return false;
    }

    AutoSave.cleanUp(bakFileName);

    // file name might have been changed by filter (extension added):
    var doc = di.getDocument();
    fileName = doc.getFileName();
    fileVersion = doc.getFileVersion()

    var mdiChild = EAction.getMdiChild();
    if (!isNull(mdiChild)) {
        var title = new QFileInfo(fileName).fileName();
        title = title.replace(/&/g, "&&");
        mdiChild.setWindowTitle(addDirtyFlag(title));
    }
    RSettings.addRecentFile(fileName);

    appWin.handleUserMessage(qsTr("Saved file:") + " " + fileName);
    if (fileVersion.length!==0) {
        appWin.handleUserMessage(qsTr("Format:") + " " + fileVersion);
    }

    var tabBar = appWin.getTabBar();
    if (!isNull(tabBar)) {
        tabBar.setTabToolTip(tabBar.currentIndex, fileName);
    }

    appWin.setProgressText();

    return true;
};

