/*
  This file is part of libkldap.
  Copyright (c) 2004-2006 Szombathelyi György <gyurco@freemail.hu>

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Library General Public
  License as published by the Free Software Foundation; either
  version 2 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
  Library General Public License for more details.

  You should have received a copy of the GNU Library General Public License
  along with this library; see the file COPYING.LIB.  If not, write to
  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  Boston, MA 02110-1301, USA.
*/

#ifndef KLDAP_LDAPCONFIGWIDGET_H
#define KLDAP_LDAPCONFIGWIDGET_H

#include <QtCore/QString>
#include <QWidget>

#include "ldapdn.h"
#include "kldap_export.h"
#include "ldapobject.h"
#include "ldapserver.h"
#include "ldapurl.h"

namespace KLDAP {

class LdapSearch;

/**
  @brief LDAP Configuration widget

  This class can be used to query the user for LDAP connection parameters.
  It's KConfigXT compatible, using widget names starting with kcfg_
*/

class KLDAP_EXPORT LdapConfigWidget : public QWidget
{
  Q_OBJECT
  Q_FLAGS( WinFlags )
  Q_ENUMS( Security )
  Q_ENUMS( Auth )
  Q_PROPERTY( WinFlags features READ features WRITE setFeatures )
  Q_PROPERTY( QString user READ user WRITE setUser )
  Q_PROPERTY( QString bindDn READ bindDn WRITE setBindDn )
  Q_PROPERTY( QString realm READ realm WRITE setRealm )
  Q_PROPERTY( QString password READ password WRITE setPassword )
  Q_PROPERTY( QString host READ host WRITE setHost )
  Q_PROPERTY( int port READ port WRITE setPort )
  Q_PROPERTY( int version READ version WRITE setVersion )
  Q_PROPERTY( LdapDN dn READ dn WRITE setDn )
  Q_PROPERTY( QString filter READ filter WRITE setFilter )
  Q_PROPERTY( QString mech READ mech WRITE setMech )
  Q_PROPERTY( Security security READ security WRITE setSecurity )
  Q_PROPERTY( Auth auth READ auth WRITE setAuth )
  Q_PROPERTY( int sizeLimit READ sizeLimit WRITE setSizeLimit )
  Q_PROPERTY( int timeLimit READ timeLimit WRITE setTimeLimit )
  Q_PROPERTY( int pageSize READ pageSize WRITE setPageSize )

  public:

    enum WinFlag {
      W_USER = 0x1,
      W_BINDDN = 0x2,
      W_REALM = 0x4,
      W_PASS = 0x8,
      W_HOST = 0x10,
      W_PORT = 0x20,
      W_VER = 0x40,
      W_DN = 0x80,
      W_FILTER = 0x100,
      W_SECBOX = 0x200,
      W_AUTHBOX = 0x400,
      W_TIMELIMIT = 0x800,
      W_SIZELIMIT = 0x1000,
      W_PAGESIZE = 0x2000,
      W_ALL = 0x2fff
    };

    typedef enum {
      None, SSL, TLS
    } Security;
    typedef enum {
      Anonymous, Simple, SASL
    } Auth;

    Q_DECLARE_FLAGS( WinFlags, WinFlag )

    /** Constructs an empty configuration widget.
     * You need to call setFlags() after this.
     * @param parent the QWidget parent
     * @param fl the window flags to set
     */
    explicit LdapConfigWidget( QWidget *parent = 0, Qt::WindowFlags fl = 0 );
    /** Constructs a configuration widget */
    explicit LdapConfigWidget( WinFlags flags, QWidget *parent = 0,
                               Qt::WindowFlags fl = 0 );
    /** Destructs a configuration widget */
    virtual ~LdapConfigWidget();

    /** Sets the user name. Kconfig widget name: kcfg_ldapuser
     *  @param user the user name to set
     */
    void setUser( const QString &user );
    /** Gets the user name. Kconfig widget name: kcfg_ldapuser */
    QString user() const;

    /** Sets the password. Kconfig widget name: kcfg_ldappassword
     *  @param password the password to set
     */
    void setPassword( const QString &password );
    /** Gets the password. Kconfig widget name: kcfg_ldappassword */
    QString password() const;

    /**
     * Sets the bind dn.
     * Kconfig widget name: kcfg_ldapbinddn
     * @param binddn the LDAP Bind DN to set
     */
    void setBindDn( const QString &binddn );
    /** Gets the bind dn. Kconfig widget name: kcfg_ldapbinddn*/
    QString bindDn() const;

    /** Sets the SASL realm. Kconfig widget name: kcfg_ldaprealm
     *  @param realm the SASL realm to set
     */
    void setRealm( const QString &realm );
    /** Gets the SASL realm. Kconfig widget name: kcfg_ldaprealm */
    QString realm() const;

    /** Sets the host name. Kconfig widget name: kcfg_ldaphost
     *  @param host the LDAP host to set
     */
    void setHost( const QString &host );
    /** Gets the host name. Kconfig widget name: kcfg_ldaphost */
    QString host() const;

    /** Sets the LDAP port. Kconfig widget name: kcfg_ldapport 
     *  @param port the LDAP port to set
     */
    void setPort( int port );
    /** Gets the LDAP port. Kconfig widget name: kcfg_ldapport */
    int port() const;

    /** Sets the LDAP protocol version. Kconfig widget name: kcfg_ldapver
     *  @param version the LDAP protocol version to set
     */
    void setVersion( int version );
    /** Gets the LDAP protocol version. Kconfig widget name: kcfg_ldapver */
    int version() const;

    /** Sets the LDAP Base DN. Kconfig widget name: kcfg_ldapdn
     *  @param dn the LDAP Base DN to set
     */
    void setDn( const LdapDN &dn );
    /** Gets the LDAP Base DN. Kconfig widget name: kcfg_ldapdn */
    LdapDN dn() const;

    /** Sets the LDAP Filter. Kconfig widget name: kcfg_ldapfilter
     *  @param filter the LDAP Filter to set
     */
    void setFilter( const QString &filter );
    /** Gets the LDAP Filter. Kconfig widget name: kcfg_ldapfilter */
    QString filter() const;

    /** Sets the SASL Mechanism. Kconfig widget name: kcfg_ldapsaslmech
     *  @param mech the SASL Mechanism to set
     */
    void setMech( const QString &mech );
    /** Gets the SASL Mechanism. Kconfig widget name: kcfg_ldapsaslmech */
    QString mech() const;

    /**
     * Sets the security type (None, SSL, TLS).
     * Kconfig widget names: kcfg_ldapnosec, kcfg_ldaptls, kcfg_ldapssl
     * @param security the security type to set
     */
    void setSecurity( Security security );
    /**
     * Returns the security type.
     * Kconfig widget names: kcfg_ldapnosec, kcfg_ldaptls, kcfg_ldapssl
     * @param security the security type to set
     */
    Security security() const;

    /**
     * Sets the authentication type (Anonymous, Simple, SASL).
     * Kconfig widget names: kcfg_ldapanon, kcfg_ldapsimple, kcfg_ldapsasl
     * @param auth the authentication type to set
     */
    void setAuth( Auth auth );
    /**
     * Returns the authentication type.
     * Kconfig widget names: kcfg_ldapanon, kcfg_ldapsimple, kcfg_ldapsasl
     * @param auth the authentication type to set
     */
    Auth auth() const;

    /**
     * Sets the size limit.
     * KConfig widget name: kcfg_ldapsizelimit
     * @param sizelimit the size limit to set
     */
    void setSizeLimit( int sizelimit );
    /**
     * Returns the size limit.
     * KConfig widget name: kcfg_ldapsizelimit
     */
    int sizeLimit() const;

    /**
     * Sets the time limit.
     * KConfig widget name: kcfg_ldaptimelimit
     * @param timelimit the time limit to set
     */
    void setTimeLimit( int timelimit );
    /**
     * Returns the time limit.
     * KConfig widget name: kcfg_ldaptimelimit
     */
    int timeLimit() const;

    /**
     * Sets the page size.
     * KConfig widget name: kcfg_ldappagesize
     * @param pagesize the page size to set
     */
    void setPageSize( int pagesize );
    /**
     * Returns the page size.
     * KConfig widget name: kcfg_ldappagesize
     */
    int pageSize() const;

    WinFlags features() const;
    void setFeatures( WinFlags features );

    /**
     * Returns a LDAP Url constructed from the settings given.
     * Extensions are filled for use in the LDAP ioslave
     */
    LdapUrl url() const;
    /**
     * Set up the widget via an LDAP Url.
     * @param url the LDAP Url to set
     */
    void setUrl( const LdapUrl &url );

    /**
     * Returns an LdapServer object constructed from the settings given.
     */
    LdapServer server() const;
    /**
     * Set up the widget via an LdapServer object.
     * @param server the LdapServer object to set
     */
    void setServer( const LdapServer &server );

Q_SIGNALS:
    /**
     * @since 4.13
     */
    void hostNameChanged(const QString &);

  private:
    class Private;
    Private *const d;

    Q_PRIVATE_SLOT( d, void setLDAPPort() )
    Q_PRIVATE_SLOT( d, void setLDAPSPort() )
    Q_PRIVATE_SLOT( d, void setAnonymous( bool ) )
    Q_PRIVATE_SLOT( d, void setSimple( bool ) )
    Q_PRIVATE_SLOT( d, void setSASL( bool ) )
    Q_PRIVATE_SLOT( d, void queryDNClicked() )
    Q_PRIVATE_SLOT( d, void queryMechClicked() )
    Q_PRIVATE_SLOT( d, void loadData( KLDAP::LdapSearch*, const KLDAP::LdapObject& ) )
    Q_PRIVATE_SLOT( d, void loadResult( KLDAP::LdapSearch* ) )
};

Q_DECLARE_OPERATORS_FOR_FLAGS( LdapConfigWidget::WinFlags )

}

#endif
