/***
   This file is part of fly-ocr.

   Copyright (C) 2016-2020 Sandro Mani <manisandro@gmail.com>
   Copyright (C) 2021 LLC "RusBITech-Astra" (https://astralinux.ru)

    Based on gImageReader source code by Sandro Mani under the GNU
    General Public License (GPL) version 3 or later

   Foobar 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.

   Foobar 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 fly-ocr. If not, see <https://www.gnu.org/licenses/>.
***/

#include <QFileDialog>
#include <QFileInfo>
#include <QStringList>

#include "configsettings.h"
#include "filedialogs.h"
#include "mainwindow.h"
#include "utils.h"

namespace FileDialogs
{

QStringList openDialog(const QString& title, const QString& initialDirectory, const QString& initialDirSetting, const QString& filter, bool multiple, QWidget* parent)
{
    parent = parent == nullptr ? MAIN : parent;
    QString initialDir = initialDirectory;
    if (initialDir.isEmpty()) {
        initialDir = ConfigSettings::get<VarSetting<QString>>(initialDirSetting)->getValue();
        if (initialDir.isEmpty()) {
            initialDir = Utils::documentsFolder();
        }
    }
    QStringList filenames;
    if (multiple) {
        filenames.append(QFileDialog::getOpenFileNames(parent, title, initialDir, filter));
    } else {
        QString filename = QFileDialog::getOpenFileName(parent, title, initialDir, filter);
        if (!filename.isEmpty()) {
            filenames.append(filename);
        }
    }
    if (!filenames.isEmpty()) {
        ConfigSettings::get<VarSetting<QString>>(initialDirSetting)->setValue(QFileInfo(filenames.first()).absolutePath());
    }
    return filenames;
}

QString saveDialog(const QString& title, const QString& initialFilename, const QString& initialDirSetting, const QString& filter, bool generateUniqueName, QWidget* parent)
{
    parent = parent == nullptr ? MAIN : parent;
    QString suggestedFile;
    if (!initialFilename.isEmpty() && QFileInfo(initialFilename).isAbsolute()) {
        suggestedFile = initialFilename;
    } else {
        QString initialDir = ConfigSettings::get<VarSetting<QString>>(initialDirSetting)->getValue();
        if (initialDir.isEmpty()) {
            initialDir = Utils::documentsFolder();
        }
        suggestedFile = QDir(initialDir).absoluteFilePath(initialFilename);
        if (generateUniqueName) {
            suggestedFile = Utils::makeOutputFilename(suggestedFile);
        }
    }
    QString filename = QFileDialog::getSaveFileName(parent, title, suggestedFile, filter);
    if (!filename.isEmpty()) {
        QString sext = QFileInfo(suggestedFile).completeSuffix();
        QString ext = QFileInfo(filename).completeSuffix();
        if (ext.isEmpty()) {
            filename += "." + sext;
        }
        ConfigSettings::get<VarSetting<QString>>(initialDirSetting)->setValue(QFileInfo(filename).absolutePath());
    }
    return filename;
}

} // FileDialogs
