/***************************************************************************
    qgsauthconfigeditor.h
    ---------------------
    begin                : October 5, 2014
    copyright            : (C) 2014 by Boundless Spatial, Inc. USA
    author               : Larry Shaffer
    email                : lshaffer at boundlessgeo dot com
 ***************************************************************************
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef QGSAUTHCONFIGEDITOR_H
#define QGSAUTHCONFIGEDITOR_H

#include "ui_qgsauthconfigeditor.h"

#include "qgis_gui.h"
#include "qgis_sip.h"
#include "qgsauthmanager.h"

#include <QSqlTableModel>
#include <QWidget>

class QgsMessageBar;

/**
 * \ingroup gui
 * \brief Widget for editing authentication configuration database.
 */
class GUI_EXPORT QgsAuthConfigEditor : public QWidget, private Ui::QgsAuthConfigEditor
{
    Q_OBJECT

  public:
    /**
     * Widget for editing authentication configurations directly in database
     * \param parent Parent widget
     * \param showUtilities Whether to show the widget's utilities button
     * \param relayMessages Whether to relay auth manager messages to internal message bar
     */
    explicit QgsAuthConfigEditor( QWidget *parent SIP_TRANSFERTHIS = nullptr, bool showUtilities = true, bool relayMessages = true );

    //! Hide the widget's title, e.g. when embedding
    void toggleTitleVisibility( bool visible );

    /**
     * Returns the list of selected authentication configuration IDs
     * \since QGIS 3.20
     */
    QStringList selectedAuthenticationConfigIds() const;

  public slots:
    //! Sets whether to show the widget's utilities button, e.g. when embedding
    void setShowUtilitiesButton( bool show = true );

    //! Sets whether to relay auth manager messages to internal message bar, e.g. when embedding
    void setRelayMessages( bool relay = true );

  private slots:
    //! Repopulate the view with table contents
    void refreshTableView();

    //! Import authentication configurations from a XML file
    void importAuthenticationConfigs();

    //! Exports selected authentication configurations to a XML file
    void exportSelectedAuthenticationConfigs();

    //! Sets the cached master password (and verifies it if its hash is in authentication database)
    void setMasterPassword();

    //! Clear the currently cached master password (not its hash in database)
    void clearCachedMasterPassword();

    //! Reset the cached master password, updating its hash in authentication database and resetting all existing configs to use it
    void resetMasterPassword();

    //! Clear all cached authentication configs for session
    void clearCachedAuthenticationConfigs();

    //! Remove all authentication configs
    void removeAuthenticationConfigs();

    //! Completely clear out the authentication database (configs and master password)
    void eraseAuthenticationDatabase();

    //! Relay messages to widget's messagebar
    void authMessageLog( const QString &message, const QString &authtag, Qgis::MessageLevel level );

    //! Pass selection change on to UI update
    void selectionChanged( const QItemSelection &selected, const QItemSelection &deselected );

    //! Update UI based upon current selection
    void checkSelection();

    void btnAddConfig_clicked();

    void btnEditConfig_clicked();

    void btnRemoveConfig_clicked();

  private:
    bool mRelayMessages;
    QgsMessageBar *messageBar();
    QString selectedConfigId();

    QSqlTableModel *mConfigModel = nullptr;

    QMenu *mAuthUtilitiesMenu = nullptr;
    QAction *mActionImportAuthenticationConfigs = nullptr;
    QAction *mActionExportSelectedAuthenticationConfigs = nullptr;
    QAction *mActionSetMasterPassword = nullptr;
    QAction *mActionClearCachedMasterPassword = nullptr;
    QAction *mActionResetMasterPassword = nullptr;
    QAction *mActionClearCachedAuthConfigs = nullptr;
    QAction *mActionRemoveAuthConfigs = nullptr;
    QAction *mActionEraseAuthDatabase = nullptr;

    bool mDisabled = false;
    QVBoxLayout *mAuthNotifyLayout = nullptr;
    QLabel *mAuthNotify = nullptr;
    bool mIsReadOnly = false;
};

#endif // QGSAUTHCONFIGEDITOR_H
