/*******************************************************************************
  XDG desktop portal implementation for TDE
  Copyright © 2024 Mavridis Philippe <mavridisf@gmail.com>

  This program or library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation; either version 2.1 of the License,
  or (at your option) any later version.

  This library 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 Lesser General Public License for more
  details.

  You should have received a copy of the GNU Lesser General Public License
  along with this library; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

  Improvements and feedback are welcome!
*******************************************************************************/

#ifndef __FILE_CHOOSER_PORTAL_H
#define __FILE_CHOOSER_PORTAL_H

// TDE
#include <tdefile.h>

// Portal
#include "interfaces/filechooserInterface.h"
#include "interface.h"
#include "dialog_result_sender.h"

class TDEFileChooserPortal;

struct FileDialogOpts
{
    TQString caption;
    TQString okButtonText;
    TQString startDir;
    TQString startName;
    TQString filters;
    bool multiple = false;
    bool directory = false;
    bool savingMode = false;
    bool modal = true;
    WId windowId = 0;

    inline KFile::Mode mode()
    {
        if (directory) return KFile::Directory;
        return multiple ? KFile::Files : KFile::File;
    }
};

class KFileDialog;

class TDEFileChooserPortal : public TQObject,
                             public org::freedesktop::impl::portal::FileChooserInterface
{
    public:
        TDEFileChooserPortal(TQT_DBusConnection &connection);
        virtual ~TDEFileChooserPortal();

    protected:
        void OpenFileAsync(int asyncCallId,
                           const TQT_DBusObjectPath& handle,
                           const TQString& app_id,
                           const TQString& parent_window,
                           const TQString& title,
                           const TQT_DBusVariantMap &options);

        void SaveFileAsync(int asyncCallId,
                           const TQT_DBusObjectPath& handle,
                           const TQString& app_id,
                           const TQString& parent_window,
                           const TQString& title,
                           const TQT_DBusVariantMap &options);

        void SaveFilesAsync(int asyncCallId,
                            const TQT_DBusObjectPath& handle,
                            const TQString& app_id,
                            const TQString& parent_window,
                            const TQString& title,
                            const TQT_DBusVariantMap &options);

        virtual void handleMethodReply(const TQT_DBusMessage& reply);
        virtual bool handleSignalSend(const TQT_DBusMessage& reply);

    private:
        TQT_DBusConnection m_connection;

        WId parseWindowId(const TQString data);

    protected:
        TQString parseFilter(const TQT_DBusData data);
        TQString parseFilterList(const TQT_DBusVariant filterData,
                                 const TQT_DBusVariant currentFilterData);

        void execFileDialog(ResultSendCallback<TDEFileChooserPortal> callback,
                            int asyncCallId,
                            FileDialogOpts options,
                            const TQT_DBusObjectPath& handle);

        DialogResult prepareReply(TQDialog *dlg);
        DialogResult prepareSaveFilesReply(TQDialog *dlg);

    friend class DialogResultSender<TDEFileChooserPortal>;
};

#endif // __FILE_CHOOSER_PORTAL_H

// kate: replace-tabs true; tab-width 4; indent-width 4;